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

C语言使用线缆回环实现串口通信时数据接收异常问题求助

Windows平台C语言串口接收问题修复方案

现存代码问题与修复方式

  • 缺失必要变量声明
    代码中直接使用了timeouts和dcbSerialParams两个结构体变量,没有提前定义,会直接导致编译失败,需要在使用前添加声明:
    COMMTIMEOUTS timeouts = {0};
    DCB dcbSerialParams = {0};
    
  • 串口路径格式错误
    CreateFileA的串口路径需要对反斜杠做转义处理,正确的COM7路径应为"\\\\.\\COM7",原写法会直接导致串口打开失败。
  • 串口配置未生效
    你仅通过GetCommState读取了当前串口配置,修改波特率、校验位、停止位等参数后,没有调用SetCommState将配置写入串口,所有参数修改都不生效。需要在参数修改完成后添加如下代码:
    if (!SetCommState(comm, &dcbSerialParams)) {
        printf("\nError! in SetCommState()");
        CloseHandle(comm);
        return 1;
    }
    
  • 参数配置与注释不符
    注释标注波特率为9600、奇偶校验为无校验,实际代码配置为57600波特率、奇校验,需要和对端设备的串口参数对齐,否则会出现收不到数据、乱码等问题。
  • 接收逻辑存在严重错误
    原接收循环的读取逻辑完全不符合ReadFile的调用规则,同时存在非法内存访问问题:
    1. ReadFile会将读到的最多BUFFERLENGTH字节数据写入SerialBuffer,有效长度由NoBytesRead返回,原代码每次仅读取单个下标的字符、全局i自增的逻辑完全错误
    2. strcat的第二个参数要求是合法字符串,原代码传入单个字符会触发内存越界访问
      修复后的接收循环代码如下:
    do {
        if (ReadFile(comm, SerialBuffer, BUFFERLENGTH, &NoBytesRead, NULL)) {
            if (NoBytesRead > 0) {
                SerialBuffer[NoBytesRead] = '\0'; // 补充字符串终止符
                printf("%s", SerialBuffer);
                strncat(finalStr, SerialBuffer, BUFFERLENGTH - strlen(finalStr) - 1); // 带长度限制的拼接,避免溢出
            }
        } else {
            break;
        }
    } while (NoBytesRead > 0);
    

额外优化建议

  • 打开串口失败后可以调用GetLastError()获取具体错误码,快速定位是路径错误、串口被占用还是权限问题
  • 写入串口数据后建议加小延时再等待接收,避免硬件还未返回数据就进入等待逻辑
  • 可以在接收完成后打印完整的finalStr做后续业务处理

内容的提问来源于stack exchange,提问作者Nilton Schumacher F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:57:03