yaya001 发表于 2009-5-25 15:17:31

调节modbus时遇到一个奇怪的问题?

先说 硬件 mega128+65LBC184(485芯片)与维纶的触摸屏相连,使用modbus,触摸屏做主。
为了观察通信过程在A B线上并联了一个485转232模块,在pc的窗口终端上观察通信情况。

维纶触摸屏上的485 上是否并联有120电阻未知,mega128+65LBC184端没有120欧,485转232模块焊接有120欧电阻(暂时没有焊下去)

软件情况,mega128端我是使用tx发送完成中断才将485芯片的方向切换成接收的。

遇到的情况是,mega128和触摸屏开始运行是正常的,大概运行5分钟左右(这是最长的时间了,有时会比这个时间短),通信就会失败,通过在pc的串口终端观察,发现触摸屏发给mega128的数据没有问题,而mega128返回触摸屏的数据,最后一个字节,也就是crc16校验位的一个字节,恒为0xFF,通过仿真器单步跟踪发现程序发送buffer中的待发送数据中的crc位都是正常的,如果设置断点,触摸屏来一帧数据,mega128回一帧数据,通信也是正常的。

问题就是出现在全速运行了大约5分钟后,出问题,出的问题是mega128返回的数据的最后一个字节(crc16检验的一个字节)内容恒为0xFF。

已经查了两天了,毫无想法了。请大家帮忙分析一下可能的原因,我按大家的意思再检查检查。

非常感谢。

注:我通信的波特率为115200,查了资料,资料中建议大于19200 使用一个固定的延时。我使用的是一个固定延时。大约1.8ms。

ba_wang_mao 发表于 2009-5-25 15:28:28

和波特率无关,主要是你的程序的问题。我也做过和维纶的通讯,从波特率1200到115200全部通讯正常。

helloshi 发表于 2009-5-25 15:29:39

tx发送完成中断才将485芯片的方向切换成接收的,可能提早,crc16检验算结果可能误,

ba_wang_mao 发表于 2009-5-25 15:30:40

1、定时中断要尽可能的短
2、串口中断要尽可能的短
3、采用串口中断+缓冲区方式接收PC机的数据
4、超时处理(长时间没有接收完一帧完整的数据,要将接收指针归零)

ba_wang_mao 发表于 2009-5-25 15:32:46

5、如果是485,发送时必须“空中断”+“完成中断”结合起来使用。
 例如:需要发送100个字节,前面99个字节用“空中断”发送,最后一个字节用“完成中断”发送,否则最后一个字节可能到达不了PC机。
  本网站上有我详细的代码。

ba_wang_mao 发表于 2009-5-25 15:36:36

网上有标准的MODBUS调试软件:“MODSCAN32”非常好用。

yaya001 发表于 2009-5-25 15:54:14

谢谢 ba_wang_mao 您提的5点

我基本上都符合啊 问题是如果是程序问题应该是开始就行 那为啥开始可以 单步可以 断点可以 就是全速时间长了不可以。

谢谢您的提醒 我在mega128发送开始后,关闭定时中断看看。

也曾怀疑是堆栈的问题,我把堆和栈都放的很大了。

zwhzwh_11 发表于 2016-1-23 17:58:25

现在解决了吗?

q457344370 发表于 2016-1-23 18:09:57

确定是完成终端而不是发送寄存器空中断?
页: [1]
查看完整版本: 调节modbus时遇到一个奇怪的问题?