UDP发送数据报错问题

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

UDP发送数据报错问题

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

一、测试环境:
硬件官方开发板:ESP32_DevKitc_V4
IDF 的具体版本:ESP-IDF v4.0.1
开发环境: Windows
软件工程:使用BSD Socket API Example 官方工程。修改了udp_client.C的应用内容。 menuconfig 做配置更改
使用 官方的BSD Socket API Example(:\esp-idf\examples\protocols\sockets\udp_client\main\udp_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:%d\n",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
Attachments
sdkconfig.txt
(26.12 KiB) Downloaded 244 times
udp_client.c
(3.99 KiB) Downloaded 241 times
串口打印报文.txt
(68.79 KiB) Downloaded 263 times

1500830209
Posts: 4
Joined: Sun Jan 08, 2023 2:35 pm

Re: UDP发送数据报错问题

Postby 1500830209 » Fri Apr 21, 2023 6:27 am

我也是遇到同样的问题,请问大哥解决了吗?官方示例源代码是每隔2s以上发送一次不会报错,但是小于该值就会报警erron 12 内存不足,我尝试发送图像数据fb->buf能20ms正常发出一帧,但是为啥发两个字符却要延时2s

Who is online

Users browsing this forum: Google [Bot] and 31 guests