求助: RS232 Modbus通讯的时候发现奇怪现象问题 点击:1727 | 回复:8



伺服爱好者

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:106
  • 注册:2007年1月11日
发表于: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下测试通过的.
    不知道有没有更好的解决方法?



wincc123

  • 精华:4帖
  • 求助:0帖
  • 帖子:41帖 | 765回
  • 年度积分:1
  • 历史总积分:1067
  • 注册:2003年10月13日
发表于:2007-01-13 17:19:00
1楼
MSCOMM的年代,你都用API了,别人还说什么呢?本来多线程就不是一般的工控的人所能搞清楚的东西,两个字,你牛,呵呵

刘志斌

  • 精华:5帖
  • 求助:0帖
  • 帖子:346帖 | 35827回
  • 年度积分:0
  • 历史总积分:75384
  • 注册:2006年7月30日
发表于:2007-01-13 17:24:00
2楼

实用者

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 15回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年2月26日
发表于:2007-01-14 15:35:00
3楼
Please check Data Acquistion Software (for both Master and Slave End) at the link below:
http://members.shaw.ca/xMasterHMI/xMaster

旷野人

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 66回
  • 年度积分:0
  • 历史总积分:600
  • 注册:2004年9月16日
发表于:2007-01-22 08:48:00
4楼
在你进行通讯的时候,你的系统肯定还有比较繁重的其他线程在工作,比如进行大量的文字显示输出等。我做过一个测试,在系统负荷比较轻的情况下,两个字节之间的时间间隔最多10毫秒,但是随着系统的负荷增加,这个时间间隔也在增加。这个你可以验证一下:将你接收到的字符全部累计输出显示,同时观察字符之间的时间间隔,你会发现随着接收到的字符的累计增多,两个字节之间的时间间隔也在不断的增加,CPU的利用率在不断的上升,如果你不停止的话,用不了多长时间你的这个程序就会崩溃。我用的是XP系统。

老星土

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 85回
  • 年度积分:0
  • 历史总积分:110
  • 注册:2006年5月04日
发表于:2007-01-22 19:31:00
5楼
问题描述不清,对串口开发还不是很了解,你说的这样情况几乎不可能发生。
http://blog.163.com/gongyuzhuo

臭脚热水泡

  • 精华:13帖
  • 求助:1帖
  • 帖子:80帖 | 582回
  • 年度积分:0
  • 历史总积分:1236
  • 注册:2005年3月27日
发表于:2007-02-02 15:49:00
6楼
API牛人

club

  • 精华:0帖
  • 求助:0帖
  • 帖子:47帖 | 739回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2007-03-30 10:09:00
7楼

伺服爱好者

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:106
  • 注册:2007年1月11日
发表于:2007-07-03 14:53:00
8楼
    这个问题进一步研究了一下,发现:
    如果是19200的波特率,每14个字符等待15ms,则不会出现接收超时的情况;如果是9600的波特率,每14个字符后,需要等待最长31ms,则不会出现接收超时的情况,如果波特率更低,则为了保证接收的正确性,等待时间更长。

    至今没有找到原因。对于“旷野人”老兄提出来的其他线程工作影响的这个原因,我想应该是有这方面的原因的,但是如何解释:如果波特率越低,等待时间就更长?为什么只在第14个字符上出现问题?则不得而知。

    目前采用了在第14的倍数字节的地方延长等待的方法(等待的时间因为波特率的不同而不同),问题是规避解决了。看样子也只能如此了。

热门招聘
相关主题

官方公众号

智造工程师