打印
[STM32]

如何对UART接收到的数据的自主纠错能力做提升?

[复制链接]
1983|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
h_8816002|  楼主 | 2016-9-6 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好!
我最近在考虑如何增加UART数据接收的健壮性。即当数据帧因扰动发生突变时,MCU如何做到能忽略这些错误进行正确的运行?
我个人的想法如下:
背景:
假设需要两组不同的数据作为MCU的某项功能的命令。(数据格式:1启动+8数据+1停止 无奇偶校验)
当temp=x1时,MCU做动作A,当temp=x2时,MCU做动作B。使用if…else if…进行判断归类。
此时在接收X1的过程中遇到了未知干扰,X1中的某些数据帧发生了突变,正常情况下,MCU不会做动作A。
解决方法:
我写特殊的数据帧格式,比如temp=0101 0101动作A,temp=1010 1010动作B
拿动作A来讲
此时使用判断语句:If(temp&0xf0=0x50||temp&0x0f=0x05){A();}
这样,只要数据帧的高四位或者低四位符合0101的格式,就可进行动作A,无论其他的怎么突变。
当然这个 4位满足即满足 还是很严苛,我们完全可以设定 2位满足即满足 这种方式。
temp=0101 0101,temp=1010 1010的格式也太过特殊,我们也可以设定为temp=0110 1000动作A,temp=1011 0011动作B这样的格式,以增加可靠性。
但是问题来了:
虽然说我按照temp=0110 1000动作A,temp=1011 0011动作B这样的格式设置后,A突变成B,B突变成A的概率已经小的不能再小,但是依然存在这种可能性。即使我改用9位格式,加入奇偶校验位,依然避免不了这种小概率事件。我想问问大家,谁有可以完全避免A、B互相突变且能增加数据健壮性的方法呢?
万分感谢

相关帖子

沙发
NE5532| | 2016-9-6 10:22 | 只看该作者
数据就是由8个0或1组成的,所以A怎么都可以变成B,无论你怎么做。如果真的要健壮,应该让收命令的单片机“应答”发命令的单片机,让其确认是否让自己做某件事,确认了以后再做,当然确认数据也可以变,但是这种概率就更小更小了。

使用特权

评论回复
板凳
coody| | 2016-9-6 10:29 | 只看该作者
我都是用CRC16做校验,应答机制,基本没碰到过误动作的。

使用特权

评论回复
地板
ayb_ice| | 2016-9-6 10:44 | 只看该作者
校验,通知重发

使用特权

评论回复
5
flaty| | 2016-9-6 14:29 | 只看该作者
帧加个 头和尾 再加个校验和,,,飞机上都这么用,不会错的,再加入命令响应式,,,,就可以了,看你是要数据 还是要效率,要数据重发,要效率 抛

使用特权

评论回复
6
yklstudent| | 2016-9-6 16:24 | 只看该作者
应该有什么编码可以进行纠错,但估计很复杂;
所以还是简单点,采用CRC等校验应答方式

使用特权

评论回复
7
icecut| | 2016-9-6 16:29 | 只看该作者
想的不错.方法也只有楼上那几种.帧结构+校验.在我的 stm32课程里详细讲过.

使用特权

评论回复
8
xyz549040622| | 2016-9-6 21:06 | 只看该作者
NE5532 发表于 2016-9-6 10:22
数据就是由8个0或1组成的,所以A怎么都可以变成B,无论你怎么做。如果真的要健壮,应该让收命令的单片机“ ...

终于知道大神长啥样了。

使用特权

评论回复
9
NE5532| | 2016-9-6 21:13 | 只看该作者
xyz549040622 发表于 2016-9-6 21:06
终于知道大神长啥样了。

哈哈,斑竹看了我的签名链接了哇?见笑啦。

使用特权

评论回复
10
xyz549040622| | 2016-9-6 21:20 | 只看该作者
NE5532 发表于 2016-9-6 21:13
哈哈,斑竹看了我的签名链接了哇?见笑啦。

趁着课程还没收费,赶紧看看。正在看第一课了,哈哈!

使用特权

评论回复
11
xyz549040622| | 2016-9-6 21:20 | 只看该作者
NE5532 发表于 2016-9-6 21:13
哈哈,斑竹看了我的签名链接了哇?见笑啦。

趁着课程还没收费,赶紧看看。正在看第一课了,哈哈!

使用特权

评论回复
12
NE5532| | 2016-9-6 21:29 | 只看该作者
xyz549040622 发表于 2016-9-6 21:20
趁着课程还没收费,赶紧看看。正在看第一课了,哈哈!

见笑了,拙作罢了,多多指教哟。

使用特权

评论回复
13
h_8816002|  楼主 | 2016-9-7 10:48 | 只看该作者
NE5532 发表于 2016-9-6 10:22
数据就是由8个0或1组成的,所以A怎么都可以变成B,无论你怎么做。如果真的要健壮,应该让收命令的单片机“ ...

谢谢,我思来想去三天,果然是不可避免的,只能把可能性尽可能的降低。斟酌再三决定加个奇偶校验然后加入应答这个功能。经过大家一说我的思路拓展了许多,听君一席话,胜读十年书哈哈哈~!

使用特权

评论回复
14
h_8816002|  楼主 | 2016-9-7 10:51 | 只看该作者
icecut 发表于 2016-9-6 16:29
想的不错.方法也只有楼上那几种.帧结构+校验.在我的 stm32课程里详细讲过.

恩,谢谢。我决定使用校验+应答机制,我刚刚毕业,没有接触过太多,谢谢耐心解答~不过我用的是NXP的片子,STM32没怎么摸索过的

使用特权

评论回复
15
h_8816002|  楼主 | 2016-9-7 10:51 | 只看该作者
yklstudent 发表于 2016-9-6 16:24
应该有什么编码可以进行纠错,但估计很复杂;
所以还是简单点,采用CRC等校验应答方式 ...

谢谢,经过大家的集思广益,我决定采用校验+应答的方式。

使用特权

评论回复
16
h_8816002|  楼主 | 2016-9-7 10:55 | 只看该作者
coody 发表于 2016-9-6 10:29
我都是用CRC16做校验,应答机制,基本没碰到过误动作的。

给我的项目是电池管理系统里面的一个小分支模块,就怕那N分之一的概率导致系统崩溃,我不能让我一个人的模块坏了整个项目,每个细节我都思来想去。。。愁死了,我觉得我年纪轻轻就要成地中海了

使用特权

评论回复
17
h_8816002|  楼主 | 2016-9-7 10:58 | 只看该作者
flaty 发表于 2016-9-6 14:29
帧加个 头和尾 再加个校验和,,,飞机上都这么用,不会错的,再加入命令响应式,,,,就可以了,看你是要 ...

我思忖再三决定使用校验+应答机制,我的模块比较小,这里是为了让MCU识别命令进入状态机,怕出错进错状态导致错误操作。要是把数据帧做的有头有尾的,是不是有大材小用之嫌呢?

使用特权

评论回复
18
h_8816002|  楼主 | 2016-9-7 11:04 | 只看该作者
ayb_ice 发表于 2016-9-6 10:44
校验,通知重发

谢谢,言简意赅。

使用特权

评论回复
19
flaty| | 2016-9-7 11:10 | 只看该作者
h_8816002 发表于 2016-9-7 10:58
我思忖再三决定使用校验+应答机制,我的模块比较小,这里是为了让MCU识别命令进入状态机,怕出错进错状态 ...

最简单的 AA55+DATA+校验和

使用特权

评论回复
20
h_8816002|  楼主 | 2016-9-7 11:24 | 只看该作者
flaty 发表于 2016-9-7 11:10
最简单的 AA55+DATA+校验和

谢谢!学习了,特意还查了查关于aa55/55aa做握手信号相关的东西,如沐春风。

使用特权

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

本版积分规则

22

主题

143

帖子

5

粉丝