打印
[经验知识]

485通讯偶尔出现第一个字节或者前两个字节丢失

[复制链接]
6375|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
影烛光|  楼主 | 2020-12-24 21:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 影烛光 于 2020-12-24 21:51 编辑

求问个各位大佬,有什么想法或者思路吗。485通讯, 波特率是115200  处理方法是中断收发数据,(中断优先级最高),主程序中检测到总线大于2ms空闲后,进行接收数据处理,再重新发送。
错误的概率不高,但是偶尔会出现。
目前最严重的情况是直接导致单片机和屏幕无法进行通讯(无法自己调节,重启后仍可能无法通讯,从这个现象来看是不是干扰的可能性大点?)

检测到的错误语句类似于:
上位机:
01 03 00 00 00 20 CRC1 CRC2
单片机:
03 00 00 00 20 CRC1 CRC2
或者
00 00 00 20 CRC1 CRC2

使用特权

评论回复
评论
影烛光 2020-12-26 21:37 回复TA
@zyj9490 :1000ms是正常的就是我延时太长,实际上是在通讯的 
zyj9490 2020-12-25 17:25 回复TA
@影烛光 :100MS无法通信,应是变量没处理好吧。 
影烛光 2020-12-25 13:47 回复TA
@zyj9490 :我这个也是这样处理的,在定时中断中累加空闲时间,然后接收字节后清零. 
zyj9490 2020-12-25 11:46 回复TA
@影烛光 :如果采用的是商用的485模块的话,它们的切换时间是固定的,不可更改,也就是说模块的方向脚改变,对外485端口不能马上切换。也可以用低波特率试下,稳定度好于高波特率。 
zyj9490 2020-12-25 11:40 回复TA
@影烛光 :计空闲变量OVERFLOW的原因。 
zyj9490 2020-12-25 11:36 回复TA
@影烛光 :纯属是软件问题,我处理问题从机,有空闲时间计数器,一方面由定时中断不断累加,另一方面由串口接收中断不断清零,只要接收到一个字节就清零。后从主程序里判空闲时间是否足够。其余。。。。 
zyj9490 2020-12-25 11:33 回复TA
@影烛光 :这种问题应是计时变量一出的问题,无法判断空闲时间了。 
影烛光 2020-12-25 11:28 回复TA
@zyj9490 :没断.就是比较慢,看起来就像是刷新不出来 
影烛光 2020-12-25 11:11 回复TA
@zyj9490 :有个奇怪的现象,根据理解,如果主机发送延时1000ms,应该也能正常通讯的吧,但是延时1000ms,就通讯不上了 
影烛光 2020-12-25 11:03 回复TA
@zyj9490 :我设置主机接收到数据后延时20ms通讯,也有一定概率出错. 

相关帖子

沙发
叶春勇| | 2020-12-25 08:18 | 只看该作者
有点像断帧。
modbus rtu通信靠的是t3.5的时间间隔,处理不好,比较容易出问题。
测试方法,用单片机发数据,pc回同样数据,进行反复测试,看看是不是硬件线路问题。排除硬件,查软件即可。

使用特权

评论回复
板凳
影烛光|  楼主 | 2020-12-25 08:41 | 只看该作者
叶春勇 发表于 2020-12-25 08:18
有点像断帧。
modbus rtu通信靠的是t3.5的时间间隔,处理不好,比较容易出问题。
测试方法,用单片机发数据 ...

谢谢,t3.5的时间间隔,我在网上看到的协议是说,波特率大于19200,使用固定时间1750us,我采用的是2ms。

使用特权

评论回复
评论
叶春勇 2020-12-26 08:31 回复TA
t3.5就是表示帧间隔。对于高波特率,的确如你所说。你的问题,建议查软件。 
地板
tom_xu| | 2020-12-25 10:19 | 只看该作者
感觉不是硬件问题,去掉R12看看,一对一通信没必要终端电阻。

使用特权

评论回复
5
影烛光|  楼主 | 2020-12-25 10:29 | 只看该作者
tom_xu 发表于 2020-12-25 10:19
感觉不是硬件问题,去掉R12看看,一对一通信没必要终端电阻。

好的,我试试看,把R12去了之后再跑一会。

使用特权

评论回复
6
影烛光|  楼主 | 2020-12-25 11:12 | 只看该作者
tom_xu 发表于 2020-12-25 10:19
感觉不是硬件问题,去掉R12看看,一对一通信没必要终端电阻。

去掉R12一样有概率会出错.

使用特权

评论回复
7
kittering| | 2020-12-25 12:31 | 只看该作者
R9  R10  R12 卸掉,示波器接485AB上,观察电平,有问题的那一帧 大概率是  有机子没释放总线 你就发数据了。

使用特权

评论回复
8
影烛光|  楼主 | 2020-12-25 13:49 | 只看该作者
kittering 发表于 2020-12-25 12:31
R9  R10  R12 卸掉,示波器接485AB上,观察电平,有问题的那一帧 大概率是  有机子没释放总线 你就发数据了 ...

这个是一对一的通讯,应该不是这个问题

使用特权

评论回复
9
长生子| | 2020-12-25 15:26 | 只看该作者
接收处理的时候又收道总线数据,然后你的接收buf没加锁……下次接收前也未初始化接收相关变量

使用特权

评论回复
10
crazybee| | 2020-12-25 15:44 | 只看该作者

使用特权

评论回复
11
dalarang| | 2020-12-25 15:56 | 只看该作者
大概率是软件问题,硬件问题的话就不会是固定只丢头两个字节了。
把上下位机的通讯处理思路发一下看看,上位机发送是固定间隔还是等待下位机反馈后再轮询?间隔时间多少毫秒?用的是哪款单片机?
主要看软件处理的思路,modbus很简单的,一般处理好T3.5的超时时间就没什么麻烦的地方。

使用特权

评论回复
12
影烛光|  楼主 | 2020-12-25 16:19 | 只看该作者
dalarang 发表于 2020-12-25 15:56
大概率是软件问题,硬件问题的话就不会是固定只丢头两个字节了。
把上下位机的通讯处理思路发一下看看,上 ...

基本上出错的情况都是丢失第一个字节,偶尔出现丢前两个字节的情况。
上位机  发送数据(等待反馈)  下位机接收,确认无误后,反馈数据。上位机收到数据后,再发送下一帧数据(等到反馈后)间隔时间设置过0,5,10,15,20,50ms 都出现过这个问题。PIC单片机

使用特权

评论回复
评论
影烛光 2020-12-25 17:36 回复TA
@zyj9490总中断一直是开启着,没有开关的操作 
zyj9490 2020-12-25 17:28 回复TA
大概率是中断无法及时处理的问题,在下位机中有没有关总中断的机制?如果有这种事情是克服不了,必须在应用层处理重复机制。 
13
wanghaoshabi| | 2020-12-25 17:02 | 只看该作者
先用示波器看一眼啊,确定软件还是硬件的问题

使用特权

评论回复
14
dalarang| | 2020-12-25 17:07 | 只看该作者
PIC我不熟悉。
中断接收后压入缓存,等待T3.5超时后取出数据进行处理,整体思路是没问题的。
你找个485转串口的转换工具,挂在485总线上专门用于侦听,在电脑上确认侦听到的双向发送是完整的话,那就可以确认是下位机软件处理的问题了。
自己检查缓存压入取出的相关语句,以及对应的其它中断吧。

使用特权

评论回复
15
moqi816| | 2020-12-25 17:28 | 只看该作者
是不是收转发或者发转收的时候没有延时啊,就是RE DE这两个引脚高低电平转换不及时

使用特权

评论回复
评论
影烛光 2020-12-25 17:38 回复TA
收转发的延时,触摸屏侧延时20ms再发出下一个指令同样有出现的可能 
16
影烛光|  楼主 | 2020-12-25 17:38 | 只看该作者
wanghaoshabi 发表于 2020-12-25 17:02
先用示波器看一眼啊,确定软件还是硬件的问题

这个概率比较小,示波器没办法看到

使用特权

评论回复
17
影烛光|  楼主 | 2020-12-25 17:39 | 只看该作者
dalarang 发表于 2020-12-25 17:07
PIC我不熟悉。
中断接收后压入缓存,等待T3.5超时后取出数据进行处理,整体思路是没问题的。
你找个485转串 ...

总觉得是不是配置有问题.

使用特权

评论回复
18
kittering| | 2020-12-26 09:36 | 只看该作者
那你单片机这么处理,接收到一帧数据,不管有没有通过校验,都把用于接收的数组清零。隔一段时间没触发串口中断,也把接收数组清零。这样 就算有掉帧了 跟后面也不冲突。

使用特权

评论回复
评论
影烛光 2020-12-26 16:06 回复TA
嗯,这个是个避免出错直接死机的办法,谢谢! 
19
Jack315| | 2020-12-26 10:27 | 只看该作者
本帖最后由 Jack315 于 2020-12-26 10:47 编辑
影烛光 发表于 2020-12-25 17:38
这个概率比较小,示波器没办法看到

确实应该先判断硬件是否有问题。

假设单片机用的是 UART,其工作方式为:
1. 空闲时,RX 脚为高电平;
2. 起始位下降沿启动接收过程;
3. 在起始位正中位置再次检测 RX 脚电平,如果为高电平,则放弃接收(一个字节丢失)。
……

在电路存在干扰的情况下,就有可能出现 LZ 描述的情况。
用示波器看一下 RX 脚上有没有干扰,必要时可以专门编一段测试代码,
让上位机连续发送 0x55,下位机连续发送 0xAA。
观察两者的 RX 脚上的波形,确保没有干扰信号。

在确定硬件电路没有问题后,再讨论软件相关的问题。
如果硬件电路确实有问题,就要找出干扰究竟来自哪里。

使用特权

评论回复
评论
影烛光 2020-12-26 16:06 回复TA
好的,我试试看!谢谢! 
20
sszxxm| | 2020-12-26 17:48 | 只看该作者
RS485通信,有个特别要注意到地方:不管主机还是从机,发送方发完了数据,一定要把总线及时释放,否则容易发生总线争抢,对方发出的数据头就有可能被切掉,导致接收不完整。
还有个问题,有些厂家的设备,并不使用标准的3.5T作为MODBUS-RTU的延时判别,这时候,你的设备与之通信,必须把延时加大,否则数据被吞掉的概率也会大增,昨晚还在一朋友的朋友圈上聊到这事儿,我提醒他发的那个延时太大了,他回复我,有些厂家的更大

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

69

帖子

0

粉丝