乐鑫技术交流
直播中

YYXIAO

8年用户 1111经验值
擅长:接口/总线/驱动
私信 关注
[问答]

ESP32_DevKitc_V4 UDP发送数据报错的原因?



  • 一、测试环境:
  •           硬件官方开发板:ESP32_DevKitc_V4
  •           IDF 的具体版本:ESP-IDF v4.0.1
  •           开发环境: Windows
  •           软件工程:使用BSD Socket API Example 官方工程。修改了udp_client.C的应用内容。 menuconfig 做配置更改
  •         使用 官方的BSD Socket API Example(:esp-idfexamplesprotocolssocketsudp_clientmainudp_client.c(如附件udp_client.c,工程配置如(sdkconfig".txt")))

  • 二、代码出现的问题:
  • sendto会随机出现return -1 的现象。
  • 错误long   errno:12 。/* Not enough space */

  • 三、提问问题:
  • 可以从串口打印中知道,报错 errno:12 时 send82493  errno:5  /hmi : 204580 /fh : 205240
  •      esp_get_minimum_free_heap_size()  204580
  •      esp_get_free_heap_size()  205240
  • 1.可以知道堆还有挺大的空间。为何会报错 errno:12。
  • 2.sendto函数用到的堆空间是在哪里申请和哪里释放的。是否可以用freerost中的void vApplicationStackOverflowHook( TaskHandle_t xTask,签名字符 *pcTaskName );早出原因吗。


  • A.源代码部分:(详细请看附件)
  • static void udp_client_task(void *pvParameters)
  • {
  •     char rx_buffer[128];
  •     char addr_str[128];
  •     int addr_family;
  •     int ip_protocol;

  •     while (1) {

  • #ifdef CONFIG_EXAMPLE_IPV4
  •         struct sockaddr_in dest_addr;
  •         dest_addr.sin_addr.s_addr = inet_addr("192.168.1.122");
  •         dest_addr.sin_family = AF_INET;
  •         dest_addr.sin_port = htons(19999);
  •         addr_family = AF_INET;
  •         ip_protocol = IPPROTO_IP;
  •         inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1);
  • #else // IPV6
  •         struct sockaddr_in6 dest_addr;
  •         inet6_aton(HOST_IP_ADDR, &dest_addr.sin6_addr);
  •         dest_addr.sin6_family = AF_INET6;
  •         dest_addr.sin6_port = htons(PORT);
  •         addr_family = AF_INET6;
  •         ip_protocol = IPPROTO_IPV6;
  •         inet6_ntoa_r(dest_addr.sin6_addr, addr_str, sizeof(addr_str) - 1);
  • #endif

  •         int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
  •         if (sock < 0) {
  •             ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
  •             break;
  •         }
  •        ESP_LOGI(TAG, "Socket created, sending to %s:%d", "192.168.1.102",9999);
  •        // uint8_t  flag1 = 2;

  •        int i = 0;
  •            int errtimer = 0;
  •                 while(1){
  •                                    int err = sendto(sock, payload, 29, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  •                     if (err < 0) {
  •                                         errtimer++;
  •                    printf("errno:%dn",errno);
  •                                     printf("send%d  errno:%d  /",i,errtimer);
  •                                         int heapmini = esp_get_minimum_free_heap_size();
  •                                     printf("hmi : %d /",heapmini);
  •                                         int ferrHeap = esp_get_free_heap_size();
  •                                         printf("fh : %d /:",ferrHeap);
  •                     int ferrinHeap = esp_get_free_heap_size();
  •                                         printf("fih : %d n",ferrinHeap);
  •                     }
  •                                 vTaskDelay(4);//4ms
  •                                 i++;
  •                                 if(i%200 == 0)
  •                                 {
  •                                          printf("send%d  errno:%d  /",i,errtimer);
  •                                         int heapmini = esp_get_minimum_free_heap_size();
  •                                     printf("hmi : %d /",heapmini);
  •                                         int ferrHeap = esp_get_free_heap_size();
  •                                         printf("fh : %d /:",ferrHeap);
  •                     int ferrinHeap = esp_get_free_heap_size();
  •                                         printf("fih : %d n",ferrinHeap);
  •                                 }
  •                 }

  •                  vTaskDelete(NULL);

  •     }
  • }


  • B.串口打印部分报文:(详细请看附件)
  • [17:33:59.440]收←◆send82000  errno:0  /hmi : 208440 /fh : 217308 /:fih : 217308

  • [17:34:00.240]收←◆send82200  errno:0  /hmi : 208440 /fh : 217932 /:fih : 217932

  • [17:34:01.040]收←◆send82400  errno:0  /hmi : 208440 /fh : 218348 /:fih : 218348

  • [17:34:01.396]收←◆errno:12
  • send82489  errno:1  /hmi : 204580 /fh : 205240 /:fih : 205240
  • errno:12
  • send82490  errno:2  /hmi : 204580 /fh : 205240 /:fih : 205240
  • errno:12
  • send82491  errno:3  /hmi : 204580 /fh : 205240 /:fih : 205240
  • errno:12
  • send82492  errno:4  /hmi : 204580 /fh : 205240 /:fih : 205240
  • errno:12
  • send82493  errno:5  /hmi : 204580 /fh : 205240 /:fih : 205240
  • errno:12
  • send82494  errno:6  /hmi : 204580 /fh : 205240 /:fih : 205240
  • errno:12
  • send82495  errno:7  /hmi : 204580 /fh : 205240 /:fih : 205240
  • errno:12
  • send82496  errno:8  /hmi : 204580 /fh : 205240 /:fih : 205240

  • [17:34:01.852]收←◆send82600  errno:8  /hmi : 204580 /fh : 218556 /:fih : 218556

  • [17:34:02.652]收←◆send82800  errno:8  /hmi : 204580 /fh : 218344 /:fih : 218344




回帖(1)

莫联雪

2024-6-20 17:16:57
以下是一些可能的原因及解决方法:

1. **网络配置问题**:
   - 确保ESP32设备已正确连接到网络,并且具有有效的IP地址。
   - 检查设备的网关和DNS设置是否正确。

2. **UDP服务器设置问题**:
   - 确保UDP服务器的IP地址和端口号与客户端设置相匹配。
   - 检查服务器是否已启动并监听指定的端口。

3. **代码问题**:
   - 检查修改后的udp_client.c文件,确保没有语法错误或逻辑错误。
   - 确保使用了正确的API调用,例如`socket()`, `bind()`, `sendto()`等。

4. **ESP-IDF版本问题**:
   - 尝试升级ESP-IDF到最新版本,以解决可能的已知问题。

5. **编译和烧录问题**:
   - 确保使用正确的命令和参数编译和烧录固件。
   - 检查烧录过程中是否有错误或警告信息。

6. **硬件问题**:
   - 检查ESP32_DevKitc_V4开发板是否有损坏或接触不良。

7. **电源问题**:
   - 确保开发板的电源供应稳定,避免电压波动影响通信。

8. **串口通信问题**:
   - 检查串口连接是否正确,确保波特率和设备设置与开发板相匹配。

9. **防火墙或安全软件干扰**:
   - 检查计算机上的防火墙或安全软件是否阻止了UDP通信。

10. **调试和日志**:
    - 使用ESP-IDF的日志系统,如`esp_log`,来记录关键步骤和错误信息,以便更好地定位问题。

解决这些问题的方法:

1. 检查网络配置和服务器设置,确保它们正确无误。
2. 仔细检查修改后的代码,确保没有错误。
3. 升级ESP-IDF到最新版本。
4. 使用正确的命令和参数进行编译和烧录。
5. 检查硬件连接和电源供应。
6. 检查串口连接和设置。
7. 关闭或配置防火墙和安全软件,以允许UDP通信。
8. 使用日志系统记录关键信息,以便分析问题。


举报

更多回帖

×
20
完善资料,
赚取积分