打印
[技术讨论]

在基本的串口收发的阴沟里翻了船,请大神支支招

[复制链接]
2240|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linxi6414|  楼主 | 2022-12-15 15:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
做了一个小板子,主板每隔50毫秒读一次这个小板,小板收到数据后,会立即回复给主板,测试中发现,经常会出现数据错误,通过逻辑分析仪监测发现,偶尔会出现小板还未接收完主板的数据,就返回数据至主板,导致主板接收到的数据异常。
打电话给梁工,他让我先测试一下定时器是否正常,写了一个LED测试程序,用示波器看,用逻辑分析仪看,时间都是非常准确的。

后来专门写了一个简单的收发程序,还是不行,调了一天一夜,现在实在是没有办法了,来论坛求助。
上面一行(紫色)是主板发送,下面一行(蓝色)是小板返回。正常的情况下,小板接收完数据后会延迟10至20毫秒返回数据(试过调长此时间,一样无效)。

这里是异常情况,小板还没有收完数据就立即返回,造成了异常。


原程序 收发测试.rar (108.64 KB)


使用特权

评论回复

相关帖子

沙发
linxi6414|  楼主 | 2022-12-15 16:14 | 只看该作者
调了这么久,有了新的发现,发现就是RX_DATA_TIME这个变量异常引起的,正常的情况下,当它等于RX_DATA_TIME==0,RX_EN_B==1两个条件成立的时候才会解调串口收到的数据,现在的问题是它还没有变为0的时候,就已经进去解调数据了。实在是想不通。

使用特权

评论回复
板凳
zchong| | 2022-12-15 16:26 | 只看该作者
linxi6414 发表于 2022-12-15 16:14
调了这么久,有了新的发现,发现就是RX_DATA_TIME这个变量异常引起的,正常的情况下,当它等于RX_DATA_TIME ...

野指针?数组越界?栈溢出?这个应该很好解决。

使用特权

评论回复
地板
linxi6414|  楼主 | 2022-12-15 16:30 | 只看该作者
zchong 发表于 2022-12-15 16:26
野指针?数组越界?栈溢出?这个应该很好解决。

就是一个简单的测试程序,没有用指针,为了防止数据越界,全部都留有余量,并且都特别检查过,实在是搞晕掉了。

使用特权

评论回复
5
binoo7| | 2022-12-15 16:41 | 只看该作者
楼主是啥问题啊,现在看现象是接收的模块有问题啊,如果是232通讯的话,无所谓啊,是全双工的,如果是485通讯的话才是半双工的

使用特权

评论回复
6
linxi6414|  楼主 | 2022-12-15 16:44 | 只看该作者
binoo7 发表于 2022-12-15 16:41
楼主是啥问题啊,现在看现象是接收的模块有问题啊,如果是232通讯的话,无所谓啊,是全双工的,如果是485通 ...

现在只是写了一个测试程序,用的是就是TTL串口,其它部分都没有工作,只是单独测试串口收发,都不正常,郁闷死。现在可以确定是程序的问题,但是却找不出来问题点。

使用特权

评论回复
7
xch| | 2022-12-15 17:52 | 只看该作者
linxi6414 发表于 2022-12-15 16:14
调了这么久,有了新的发现,发现就是RX_DATA_TIME这个变量异常引起的,正常的情况下,当它等于RX_DATA_TIME ...

在判断条件 RX_DATA_TIME 前禁止中断,完成后开放中断试试.

使用特权

评论回复
8
R2D2| | 2022-12-15 18:00 | 只看该作者
xch 发表于 2022-12-15 17:52
在判断条件 RX_DATA_TIME 前禁止中断,完成后开放中断试试.

RX_DATA_TIME数据类型是unsigned char,那么一定是原子操作,所以不需要关中断。

使用特权

评论回复
9
forrest11| | 2022-12-15 18:17 | 只看该作者
你这个程序看起来太费劲了,变量随便命名,函数结构也随意。唉。
我看到的关键语句: if(dat==X&&RX_DATA[0]==0xa5)
所以看到出错了,一定是校验错了,或收到包头不是A5,你认为的提前发,就是因为收到的包头不是A5,你用中断方式看看TX_SYS_ERR(3)时,收到的是不是A5吧。

使用特权

评论回复
10
linxi6414|  楼主 | 2022-12-15 22:59 | 只看该作者
caosix 发表于 2022-12-15 22:02
按理说:不算复杂。。。重点 你有先解决 接收帧 起头,与结尾 都健壮,即使有错码,下一帧能自我恢复。 ...

如果是数据错误那还好说,现在的问题是时序都不对,这个问题就严重了,上面贴的有逻辑分析仪分析出来的时序,现在的问题是时序都不对,明显的错误,这个肯定是不行的。

使用特权

评论回复
评论
zlf1208 2022-12-18 14:59 回复TA
时序错误有二种可能:1. 中断没处理好;2. 通讯协议没处理好 
11
linxi6414|  楼主 | 2022-12-15 23:23 | 只看该作者
forrest11 发表于 2022-12-15 18:17
你这个程序看起来太费劲了,变量随便命名,函数结构也随意。唉。
我看到的关键语句: if(dat==X&&RX_DATA[0 ...

数据是对的,主要是的问题请看第二张图片,正常的情况下,无论数据对与错,返回数据的时间都是一样的,哪怕我的主板随便发几个数据过去,也是要等到数据发完之后,并且等到RX_DATA_TIME==0的时候才能返回数据(此时返回的数据会告诉我到底是数据错在哪里),现在的问题是这个RX_DATA_TIME==0根本就没有等于0,小板就开始返回数据了,这样就造成了数据的拥堵,出现数据异常。

使用特权

评论回复
12
玄德| | 2022-12-15 23:27 | 只看该作者

把两个条件都加上括号。

使用特权

评论回复
13
linxi6414|  楼主 | 2022-12-16 00:00 | 只看该作者
玄德 发表于 2022-12-15 23:27
把两个条件都加上括号。

试过,没有效果

从小板上另外引出了一个测试脚去监测RX_DATA_TIME的时间长度,当串口接收到新数据后,就拉低此引脚,当定时器将此时间减到0的时候,就拉高此引脚,正常的情况下,只有当此引脚拉高后,小板才会开始返回数据,见下图。


异常的时候,监测的这个引脚还没有被拉高,也就是RX_DATA_TIME的时间还没有减到0,小板就已经开始返回数据了,现在修改了程序,返回的程序带有计数,返回的数据是和发送的数据是一样的,也就是数据的第3位和第4位用于计录发送次数,可以确定返回的一定不是上次读的数据,也就是说这个判断语句出了问题if(RX_DATA_TIME==0&&RX_EN_B==1),原本应该判断RX_DATA_TIME==0时才能返回数据,现在不为0居然也能进入,很是不解,异常的波形如下。


12094639b4204be44c.png (1.63 KB )

12094639b4204be44c.png

使用特权

评论回复
14
aimie| | 2022-12-16 09:22 | 只看该作者
所谓的收到肯定不是完整收到并且验证后返回,估计所谓的收到只验证了前面几个字节 ,就触发了返回,但是这个时候另外一端还在发送,

使用特权

评论回复
15
wang1979| | 2022-12-16 09:45 | 只看该作者
if(dat==X&&RX_DATA[0]==0xa5)   改成: if(dat==X)&&(RX_DATA[0]==0xa5)  试试行不?

使用特权

评论回复
16
Unarty| | 2022-12-16 09:50 | 只看该作者
本帖最后由 Unarty 于 2022-12-16 09:53 编辑

一个主板,一个小板,两个问题分开查找才对。 第一步:确认协议原理,小板是不是被动的接收到数据才发送,还是按自主的周期主动上传数据?从上面的描述来看,与你的板数据回应有关系。正常的主从协议,要主机数据传送结束后从机接收数据回应数据,但你这程序根本就不管主机数据内容主动上传数据。
如果是标准的主从协议:就是小板程序有问题,
如果不是,就是简单的周期上报,就是两个板之间的时间周期,运行中出现不同步。

使用特权

评论回复
17
linxi6414|  楼主 | 2022-12-16 12:25 | 只看该作者
Unarty 发表于 2022-12-16 09:50
一个主板,一个小板,两个问题分开查找才对。 第一步:确认协议原理,小板是不是被动的接收到数据才发送, ...

上面已经有描述过,小板是被动的,只有接收到主板的数据并且延迟后,才会回复,哪怕主板发送的数据是错的,也会回复错误信息(同样是延迟回复)。现在的问题是偶尔会出现主板在发送数据的过程中,小板就开始返回数据,这个是不正常的。

使用特权

评论回复
18
linxi6414|  楼主 | 2022-12-16 12:30 | 只看该作者
wang1979 发表于 2022-12-16 09:45
if(dat==X&&RX_DATA[0]==0xa5)   改成: if(dat==X)&&(RX_DATA[0]==0xa5)  试试行不?

刚刚试过,还是一样。

使用特权

评论回复
19
linxi6414|  楼主 | 2022-12-16 12:42 | 只看该作者
aimie 发表于 2022-12-16 09:22
所谓的收到肯定不是完整收到并且验证后返回,估计所谓的收到只验证了前面几个字节 ,就触发了返回,但是这 ...

对对对,你的理解完全正确,目前逻辑分析仪的结果就是这样的,每次上电最多只能正常工作十几秒就不行了,有时一两秒就不行了,现在在主板的接收中加了一个while死循环,如果发现数据异常就停止发送读,这样比较好监测,很快就能够定位出问题,但是查看程序,却找不出漏洞,这个就有点头大。

使用特权

评论回复
20
Unarty| | 2022-12-16 15:01 | 只看该作者
本帖最后由 Unarty 于 2022-12-16 15:27 编辑
linxi6414 发表于 2022-12-16 12:25
上面已经有描述过,小板是被动的,只有接收到主板的数据并且延迟后,才会回复,哪怕主板发送的数据是错的 ...

你的 RX_DATA_TIME 是什么时候置位的?? 在if 里面 把RX_DATA_TIME = 0xFFFF. 试试

使用特权

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

本版积分规则

63

主题

622

帖子

5

粉丝