完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、测试环境:
硬件官方开发板: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个回答
|
|
在这种情况下,我们需要分析可能导致ESP32_DevKitc_V4在使用UDP发送数据时出现问题的原因。以下是一些可能的原因和解决方案:
1. 网络配置问题: 确保您的ESP32设备已正确配置并连接到网络。检查您的WiFi SSID和密码是否正确。 2. IP地址和端口设置: 检查您的代码中设置的目标IP地址和端口号是否正确。确保它们与您要连接的服务器或设备匹配。 3. 代码错误: 检查您的代码,特别是UDP发送和接收部分,确保没有逻辑错误或语法错误。如果可能,请参考官方示例代码进行比较。 4. 缓冲区大小: 检查您的代码中设置的缓冲区大小是否足够大,以便容纳要发送的数据。如果缓冲区太小,可能会导致数据发送失败。 5. 超时设置: 检查您的代码中的超时设置,确保它们在合理的范围内。过长的超时可能会导致发送失败。 6. 重试机制: 考虑在您的代码中实现重试机制,以便在发送失败时重新尝试发送数据。 7. 错误处理: 确保您的代码中有适当的错误处理逻辑,以便在出现问题时能够捕获并处理错误。 8. 驱动和固件问题: 检查您的ESP32设备是否使用了最新的驱动和固件。如果有更新,请尝试更新它们。 9. 硬件问题: 检查您的ESP32_DevKitc_V4硬件是否存在任何问题,如损坏的元件或连接问题。 10. 环境问题: 确保您的开发环境设置正确,包括编译器、工具链和其他依赖项。 要解决这些问题,您可以尝试以下步骤: 1. 仔细检查您的网络配置和IP地址设置。 2. 检查您的代码,确保没有逻辑错误或语法错误。 3. 调整缓冲区大小和超时设置。 4. 实现重试机制和错误处理逻辑。 5. 更新驱动和固件。 6. 检查硬件和环境设置。 通过逐步排查和解决这些问题,您应该能够找到导致UDP发送数据报错的原因,并采取相应的措施来解决问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
429浏览 6评论
362浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
343浏览 5评论
349浏览 4评论
327浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-1 14:57 , Processed in 0.756863 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191