CSerialPort 接收时丢失数据问题

来源:互联网 发布:如何提高情商 知乎 编辑:程序博客网 时间:2024/06/05 05:08

如需转载请标明出处:http://blog.csdn.net/itas109 

QQ技术交流群:129518033

 

哪位大神对 CSerialPort (作者是Remon Spekreijse)这个类比较熟?最近发现使用USB转RS-232连PC时,使用CSerialPort接收时会发生丢数据的情况,丢失率1.3%左右。直接使用RS-232则不会出现丢数据的情况。不过使用串口助手也不会出现这种情况。有没有相同经历的同仁?

 

个人见解:  USB 转 232 一般为了提高USB数据包的载荷率, 会有一个延迟计时器, 以便将一段时间内的数据组成USB数据帧, 可能在这段时间内的数据超过了缓冲区长度,  可以在驱动设置中降低这个设置值, 
或者 SetupComm 加大缓冲区长度

 

解决方法找到了,但是具体原因不是很清楚。

后来进行多次测试之后发现,当满足以下条件时,将会出现数据丢失的情况:
1.连接线使用USB转RS-232
2.PC端接收数据的同时,发送数据。
3.发送数据的速度大于接收数据的速度。发送速度越快,数据丢失率越高。发送速度越慢,数据丢失率越低。

解决方法是:
将 WriteChar(CSerialPort* port) 内部的

PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);


改为:

PurgeComm(port->m_hComm, PURGE_TXCLEAR | PURGE_TXABORT);



But,为什么在不修改代码的情况下,直接使用RS-232连接线不会出现数据丢失的情况呢??清空接收缓冲区了,数据接收为什么没有丢失??

 

       参考:http://bbs.csdn.net/topics/390996461

如需转载请标明出处:http://blog.csdn.net/itas109 

QQ技术交流群:129518033

 

0 0
原创粉丝点击