You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中UDP/UART发送整数数组返回0的问题咨询

C++ UDP与UART发送整数数组返回0的问题排查与修复

问题核心原因

不是库的问题,完全是代码逻辑错误,最关键的问题是数组作为函数参数时的退化导致长度计算错误。

在C++中,当你把数组(比如uint8_t data[])作为函数参数传递时,数组会自动退化为指向首元素的指针。此时sizeof(data)获取的是指针的字节长度(64位系统为8字节,32位为4字节),而不是数组的实际元素总字节数。如果你的代码依赖这个错误的长度值,会导致发送长度参数异常,甚至出现返回0的情况。

另外,套接字/串口的初始化错误,也是发送返回0的潜在诱因。

修复方案

1. 修正长度传递逻辑

修改send_data函数,额外传入数组的实际长度参数,避免依赖退化指针的sizeof计算:

void UDP::send_data(uint8_t data[], size_t length) const {
    sendto(udp, data, length, MSG_CONFIRM, 
          (const struct sockaddr *) &client_addr, len);
}

void UART::send_data(uint8_t data[], size_t length) const {
    write(uart, data, length);
}

调用时直接传入数组的实际长度:

uint8_t my_data[] = {0x01, 0x02, 0x03, 0x04};
// 调用UDP发送
udp.send_data(my_data, sizeof(my_data));
// 调用UART发送
uart.send_data(my_data, sizeof(my_data));

2. 排查初始化与错误处理

  • 确认UDP的udp套接字描述符是否通过socket()成功创建,client_addr是否正确填充(比如设置了目标IP和端口),len变量是否被初始化为sizeof(client_addr)。
  • 确认UART的uart文件描述符是否通过open()成功打开(返回值不为-1),串口参数(波特率、奇偶校验等)是否配置正确。
  • 增加错误输出,明确问题点:
    // UDP发送示例
    ssize_t udp_ret = sendto(udp, data, length, MSG_CONFIRM, (const struct sockaddr *)&client_addr, len);
    if (udp_ret == -1) {
        perror("UDP sendto failed");
    } else if (udp_ret == 0) {
        printf("UDP sent 0 bytes\n");
    }
    
    // UART发送示例
    ssize_t uart_ret = write(uart, data, length);
    if (uart_ret == -1) {
        perror("UART write failed");
    } else if (uart_ret == 0) {
        printf("UART wrote 0 bytes\n");
    }
    

总结

不需要更换库,sys/socket.h、fcntl.h、netinet/in.h都是Linux/Unix环境下进行网络和串口通信的标准可靠库。问题完全出在代码逻辑上,核心是数组退化为指针导致的长度计算错误,配合初始化检查和错误输出即可解决。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:27:40