大家好!
我最近在考虑如何增加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互相突变且能增加数据健壮性的方法呢?
万分感谢!
|