bool UartRcvData(LPCBYTE data,DWORD len)
bool UartSendData(LPCBYTE data,DWORD len)
为了达到次目的,吃苦不少。一开始采用了MSCOMM的控件,该控件将win32的串口功能封装的太厉害,我完全不了解串口收发的过程,只能靠一些神奇的sleep,去完成数据收发事件的触发,可移植性、操作性都非常差。而且有的电脑还需注册该控件,麻烦的很~就像很多人反应的,它其实不是很好用。
于是开始研究串口的的win32 API的直接实现。并发现了一个不错的封装类CSerialPort:
http://www.naughter.com/serialport.html
把这个看懂,基本上WIN32 串口的API怎么使用,也就没问题了。
我的实现几个关键点:
1.采用I/O交叠方式而不是阻塞;
2.一开始用设立 EV_RXCHAR事件,作为接收的触发;
3.如何避免error 87的错误。该错误是在I/O交叠方式下,WaitCommEvent会立即返回,若GetLastError返回错误不是IO_PENDING,则下一次再执行WaitCommEvent时,将返回error 87L。在这里,我参考了这位童鞋的方法:
http://blog.csdn.net/nwpu053883/article/details/6643306
4.WaitForSingleObject时,用超时等待方式,而不是INFINITE,等待串口接收事件的受信态。这样再串口数据发送方过快(如BPR 115200)时,很有可能阻塞住,事件永远不会受信;
5.最关键的,即便采用超时等待,程序依然可能不会按想象的那样先让事件受信,然后再去读。我猜测,在Wa