发表于:2007-01-11 17:05:00
楼主
使用RS232与下位机进行Modbus通讯, 上位机使用VC编程, 通讯使用windows API.
发现在RTU模式下,有如下奇怪的现象:
由于modbus是半双工的, 这里使用一个线程进行收发,并且收发采用read/write/waitforsingleobject的方式, 并且数据接收是逐字接收.
发现在数据接收的时候, 每接收完14个字节,有时会等待很长的时间, 其中19200以上的波特率, 时间在15毫秒以内, 9600波特率的时间在32毫秒以内;4800波特率时间在48毫秒以内;2400波特率在80毫秒以内, 1200波特率在160毫秒以内. 如果字节超时时间足够长, 所有的数据都能完整的接收下来,只是这样的话效率会很低.
用示波器查看下位机发送的波形,根本没有时间延迟.并且通过API查看串口的收发缓冲区, 至少100字节,空间足够. 不知道这是否是微软的一个bug?
请问有没有兄弟遇到过类似的问题?怎么解决的?
我现在的解决方法很土, 因为windows 默认的时间粒度是15毫秒,所以采用: 如果连续接收字节超过14, 或者连续接收按照该波特率15毫秒发送的数字之后; 就休眠15毫秒.
解决的结果是对于9600波特率以上或者以下,基本上都没问题了,几乎没有失败现象.但是对于9600的波特率,仍然偶尔有超时的问题(但是数量很少).
并且这只是对于windows 2000下测试通过的.
不知道有没有更好的解决方法?