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的调用规则,同时存在非法内存访问问题:ReadFile会将读到的最多BUFFERLENGTH字节数据写入SerialBuffer,有效长度由NoBytesRead返回,原代码每次仅读取单个下标的字符、全局i自增的逻辑完全错误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
相关产品推荐
相关产品推荐

