炯哈哈 2024-08-24 11:49 采纳率: 28.6%
浏览 8

lwip-2.1.2 udp sendto()丢失数据

单片机 FreeRTOS lwip 任务1接收数据放到队列,然后转给另一个设备,不丢数据,任务2从队列中取出数据,sendto发送到socket,sendto返回的size总数是正确的,但是到udp的接收到数据就缺失了,请问是什么问题,是板子的问题,还是程序的问题,tcp的话则不会丢失数据

附上发送代码

void can0_to_udp(int sockfd)
{
    int can0_queue_size = uxQueueMessagesWaiting(can0_queue);
    if (can0_queue_size > 0) {
        if (can0_queue_size >= can0_config_data.subpackage_num
            || (xTaskGetTickCount() - can0_last_send_time >= can0_config_data.delay_time)) {
            queue_recv_count += can0_queue_size;
            uint8_t tmp_buf[650];
            memset(tmp_buf, 0, sizeof(tmp_buf));

            uint8_t* ptr = tmp_buf;
            for (int i = 0; i < can0_queue_size;i++) {
                xQueueReceive(can0_queue, ptr, 0);
                ptr += 13;
            }

            int size = sendto(sockfd, (void*)&tmp_buf, can0_queue_size * 13, 0, (struct sockaddr*)&remote_can0_addr, sizeof(remote_can0_addr));

            // printf("size = %d\n", size);
            send_cout_test += size;
            if (size < 0 || size != can0_queue_size * 13) {
                printf("send error size = %d\n", size);
            }

            can0_last_send_time = xTaskGetTickCount();
        }

    } else {
        vTaskDelay(1);
    }

}

  • 写回答

1条回答 默认 最新

  • 吃不了席 2024-08-24 11:50
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码,可能的原因是UDP协议本身是不可靠的传输协议,它不保证数据包的到达和顺序。在网络状况不佳的情况下,UDP数据包可能会丢失。而TCP协议是可靠的传输协议,它会保证数据包的到达和顺序。

    为了解决这个问题,您可以尝试以下方法:

    1. 增加重发机制:当发送数据包后,如果没有收到对方的确认消息,可以再次发送数据包。这可以通过设置一个定时器来实现,如果在规定时间内没有收到确认消息,就重新发送数据包。

    2. 使用TCP协议替换UDP协议:虽然TCP协议会增加通信的延迟,但它可以保证数据包的可靠传输。如果您的应用对实时性要求不高,可以考虑使用TCP协议。

    3. 优化网络环境:检查您的网络设备和配置,确保网络状况良好。如果可能的话,可以尝试使用有线连接替换无线连接,以提高网络的稳定性。

    4. 调整LwIP的配置:LwIP提供了一些参数来调整UDP的性能,例如最大接收队列大小、最大未确认的数据包数量等。您可以尝试调整这些参数,以优化UDP的性能。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月24日

悬赏问题

  • ¥60 QQOP数据,什么是op数据号,怎么提取op数据!能不能大量提取(语言-c语言)
  • ¥15 matlab代码 关于微分方程和嵌套的分段函数。
  • ¥15 把VMware项目复制到另一台电脑
  • ¥15 onlyoffice编辑完后立即下载,下载的不是最新编辑的文档
  • ¥15 求caverdock使用教程
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密