完善资料让更多小伙伴认识你,还能领取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个回答
|
|
以下是一些可能导致这个问题的原因和解决方法:
1. **网络连接问题**:确保您的设备已经正确连接到网络,并且可以访问目标IP地址和端口。 2. **缓冲区问题**:检查您的应用程序是否正确地分配和使用缓冲区。如果缓冲区太小或数据未正确填充,可能导致发送失败。 3. **超时设置**:检查您的应用程序是否设置了合适的超时时间。如果超时时间过短,可能导致发送操作在完成之前就被中断。 4. **错误处理**:在您的代码中添加错误处理逻辑,以便在sendto函数返回-1时,可以捕获并处理错误。例如: ```c int ret = sendto(sockfd, send_buf, send_len, 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (ret < 0) { printf("Send failed: %dn", errno); // 根据errno的值进行错误处理 } ``` 5. **ESP-IDF版本问题**:虽然您使用的是ESP-IDF v4.0.1,但有时候某些版本可能存在已知的bug。尝试升级到最新版本的ESP-IDF,看看问题是否得到解决。 6. **硬件问题**:虽然不太可能,但硬件问题也可能导致sendto函数失败。确保您的ESP32开发板没有损坏,并且所有连接都是正确的。 7. **代码逻辑问题**:检查您的代码逻辑,确保在调用sendto之前,socket已经正确创建并且连接状态正常。 8. **资源限制**:检查您的系统资源使用情况,确保没有达到系统资源的限制,如内存或文件描述符。 9. **调试和日志**:增加更多的调试信息和日志输出,以便更好地了解sendto函数失败的上下文和原因。 |
|
|
|
只有小组成员才能发言,加入小组>>
1024 浏览 1 评论
562浏览 6评论
469浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
454浏览 5评论
454浏览 4评论
428浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 20:48 , Processed in 0.832705 second(s), Total 82, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号