这两天在做串口通讯上位机的开发,遇到了一个比较棘手的问题。使用Win32函数PurgeComm始终不能成功清除接收缓冲区中的数据,老是接收到不需要的数据。
刚开始,我以为是我的串口配置出了问题,检查了一遍,没发现什么问题。
然后,就开始百度,搜到的相关网页挺多的,却没什么卵用。
后来,抱着试试看的态度,我使用国外搜索引擎“http://www.aol.com/”。国外一位同行说,他也遇到了这样的问题,后来在使用PurgeComm函数之前,Sleep了一段时间,问题就解决了。
好奇怪。我的相应代码:
// ......
Sleep(16); // i don't know why, without Sleep(16), PurgeComm function below
// can't work. maybe it's a timing problem. and "16" is the minimum
// value that make it works.
// discards all characters in the input buffer
if (!PurgeComm(hSerial, PURGE_RXCLEAR))
{
strErrorMsg = "CSerialComm::OneWireRecv : error occured when clear receive buffer";
return -1;
}
// ......
在做串口开发之前,在网上看了一些文档。
我觉得
PurgeComm,应该在需要的时候再用,而不是单纯的每次收发数据时都调用一次。
ClearCommError,应该在串口出错的时候,再调用,清除通讯设备的错误标志,使接收操作继续正常运行。
还有一个最重要的,一定要判断返回值,一定要判断返回值。