调节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。 和波特率无关,主要是你的程序的问题。我也做过和维纶的通讯,从波特率1200到115200全部通讯正常。 tx发送完成中断才将485芯片的方向切换成接收的,可能提早,crc16检验算结果可能误, 1、定时中断要尽可能的短
2、串口中断要尽可能的短
3、采用串口中断+缓冲区方式接收PC机的数据
4、超时处理(长时间没有接收完一帧完整的数据,要将接收指针归零) 5、如果是485,发送时必须“空中断”+“完成中断”结合起来使用。
例如:需要发送100个字节,前面99个字节用“空中断”发送,最后一个字节用“完成中断”发送,否则最后一个字节可能到达不了PC机。
本网站上有我详细的代码。 网上有标准的MODBUS调试软件:“MODSCAN32”非常好用。 谢谢 ba_wang_mao 您提的5点
我基本上都符合啊 问题是如果是程序问题应该是开始就行 那为啥开始可以 单步可以 断点可以 就是全速时间长了不可以。
谢谢您的提醒 我在mega128发送开始后,关闭定时中断看看。
也曾怀疑是堆栈的问题,我把堆和栈都放的很大了。 现在解决了吗? 确定是完成终端而不是发送寄存器空中断?
页:
[1]