UDP发送数据报错问题

wu_jingsheng
Posts: 3
Joined: Tue Oct 12, 2021 10:14 am

UDP发送数据报错问题

Postby wu_jingsheng » Thu Oct 21, 2021 2:45 am

  1. [b]一、测试环境:[/b]
  2.           硬件官方开发板:ESP32_DevKitc_V4
  3.           IDF 的具体版本:ESP-IDF v4.0.1
  4.           开发环境: Windows
  5.           软件工程:使用BSD Socket API Example 官方工程。修改了udp_client.C的应用内容。 menuconfig 做配置更改
  6.         使用 官方的BSD Socket API Example(:\esp-idf\examples\protocols\sockets\udp_client\main\udp_client.c(如附件udp_client.c,工程配置如(sdkconfig".txt")))
  7.  
  8. [b]二、代码出现的问题:[/b]
  9. sendto会随机出现return -1 的现象。
  10. 错误long   errno:12 。/* Not enough space */
  11.  
  12. [b]三、提问问题:[/b]
  13. 可以从串口打印中知道,报错 errno:12 时 send82493  errno:5  /hmi : 204580 /fh : 205240
  14.      esp_get_minimum_free_heap_size()  204580
  15.      esp_get_free_heap_size()  205240
  16. 1.可以知道堆还有挺大的空间。为何会报错 errno:12。
  17. 2.sendto函数用到的堆空间是在哪里申请和哪里释放的。是否可以用freerost中的void vApplicationStackOverflowHook( TaskHandle_t xTask,签名字符 *pcTaskName );早出原因吗。
  18.  
  19.  
  20. [b]A.源代码部分:(详细请看附件)[/b]
  21. static void udp_client_task(void *pvParameters)
  22. {
  23.     char rx_buffer[128];
  24.     char addr_str[128];
  25.     int addr_family;
  26.     int ip_protocol;
  27.  
  28.     while (1) {
  29.  
  30. #ifdef CONFIG_EXAMPLE_IPV4
  31.         struct sockaddr_in dest_addr;
  32.         dest_addr.sin_addr.s_addr = inet_addr("192.168.1.122");
  33.         dest_addr.sin_family = AF_INET;
  34.         dest_addr.sin_port = htons(19999);
  35.         addr_family = AF_INET;
  36.         ip_protocol = IPPROTO_IP;
  37.         inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1);
  38. #else // IPV6
  39.         struct sockaddr_in6 dest_addr;
  40.         inet6_aton(HOST_IP_ADDR, &dest_addr.sin6_addr);
  41.         dest_addr.sin6_family = AF_INET6;
  42.         dest_addr.sin6_port = htons(PORT);
  43.         addr_family = AF_INET6;
  44.         ip_protocol = IPPROTO_IPV6;
  45.         inet6_ntoa_r(dest_addr.sin6_addr, addr_str, sizeof(addr_str) - 1);
  46. #endif
  47.  
  48.         int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
  49.         if (sock < 0) {
  50.             ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
  51.             break;
  52.         }
  53.        ESP_LOGI(TAG, "Socket created, sending to %s:%d", "192.168.1.102",9999);
  54.        // uint8_t  flag1 = 2;
  55.  
  56.        int i = 0;
  57.            int errtimer = 0;
  58.                 while(1){
  59.                             [i][b]       int err = sendto(sock, payload, 29, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  60.                     if (err < 0) {
  61.                                         errtimer++;
  62.                    printf("errno:%d\n",errno);
  63.                                     printf("send%d  errno:%d  /",i,errtimer);
  64.                                         int heapmini = esp_get_minimum_free_heap_size();
  65.                                     printf("hmi : %d /",heapmini);
  66.                                         int ferrHeap = esp_get_free_heap_size();
  67.                                         printf("fh : %d /:",ferrHeap);
  68.                     int ferrinHeap = esp_get_free_heap_size();
  69.                                         printf("fih : %d \n",ferrinHeap);[/b][/i]
  70.                     }
  71.                                 vTaskDelay(4);//4ms
  72.                                 i++;
  73.                                 if(i%200 == 0)
  74.                                 {
  75.                                          printf("send%d  errno:%d  /",i,errtimer);
  76.                                         int heapmini = esp_get_minimum_free_heap_size();
  77.                                     printf("hmi : %d /",heapmini);
  78.                                         int ferrHeap = esp_get_free_heap_size();
  79.                                         printf("fh : %d /:",ferrHeap);
  80.                     int ferrinHeap = esp_get_free_heap_size();
  81.                                         printf("fih : %d \n",ferrinHeap);
  82.                                 }
  83.                 }
  84.  
  85.                  vTaskDelete(NULL);
  86.  
  87.     }
  88. }
  89.  
  90.  
  91. [b]B.串口打印部分报文:(详细请看附件)[/b]
  92. [17:33:59.440]收←◆send82000  errno:0  /hmi : 208440 /fh : 217308 /:fih : 217308
  93.  
  94. [17:34:00.240]收←◆send82200  errno:0  /hmi : 208440 /fh : 217932 /:fih : 217932
  95.  
  96. [17:34:01.040]收←◆send82400  errno:0  /hmi : 208440 /fh : 218348 /:fih : 218348
  97.  
  98. [17:34:01.396]收←◆errno:12
  99. [b][i]send82489  errno:1  /hmi : 204580 /fh : 205240 /:fih : 205240
  100. errno:12
  101. send82490  errno:2  /hmi : 204580 /fh : 205240 /:fih : 205240
  102. errno:12
  103. send82491  errno:3  /hmi : 204580 /fh : 205240 /:fih : 205240
  104. errno:12
  105. send82492  errno:4  /hmi : 204580 /fh : 205240 /:fih : 205240
  106. errno:12
  107. send82493  errno:5  /hmi : 204580 /fh : 205240 /:fih : 205240
  108. errno:12
  109. send82494  errno:6  /hmi : 204580 /fh : 205240 /:fih : 205240
  110. errno:12
  111. send82495  errno:7  /hmi : 204580 /fh : 205240 /:fih : 205240
  112. errno:12
  113. send82496  errno:8  /hmi : 204580 /fh : 205240 /:fih : 205240 [/i]
  114. [/b]
  115. [17:34:01.852]收←◆send82600  errno:8  /hmi : 204580 /fh : 218556 /:fih : 218556
  116.  
  117. [17:34:02.652]收←◆send82800  errno:8  /hmi : 204580 /fh : 218344 /:fih : 218344

Who is online

Users browsing this forum: No registered users and 74 guests