STM32
直播中

王波

7年用户 1380经验值
私信 关注
[问答]

H750 UART 7数据位 + 校验接收数据异常的原因?如何解决?

H750 UART 7数据位 + 校验接收数据异常的原因?如何解决?

回帖(1)

杨颜

2021-12-6 10:01:59
如何配置
首先是设置寄存器,按正常设置走就可以,唯一需要注意的地方是串口CR1寄存器的字长设置:
根据帧格式表可以看到,9位数据和8位数据+1位校验所设的M位值相同




所以在CR1寄存器中字长位寄存器的描述,这里所写的数据位其实是指我们平时所说的数据位+校验位





即:
N / 7 / 1:7个数据位,M = 10
ODD / 7 / 1:8个数据位,M = 00
N / 8 / 1: 8个数据位,M = 00

现在的代码是串口ODD / 7 / 1, 接收数据,然后发往网络端。
字长寄存器、校验相关的寄存器都设置完成后,串口发送0x31 0x32 0x33,网络端实际收到的是 0x31 0x32 0xB3:




这就很奇怪了,按道理来说,7数据位下不应该存在大于0x7F的数据。
一开始怀疑是串口工具的问题,拿逻辑分析仪抓了下串口的TTL端,数据是正确的。





但也非常容易发现,发生错误的数据0x33,因为奇校验的关系,校验位为1,而10110011刚好为0xB3,所以猜测是单片机将校验位的bit当成了8位数据位里的最高位处理了。
改成偶校验验证猜想:










直接在逻辑分析仪上改为N/8/1解析,完全正确:




因此基本可以验证猜想:单片机在7数据位+校验位的设置下,将校验位当做8位数据位里的最高位给处理了,校验位为1时就会导致数据错误。
如果直接将字长寄存器改为7,同时又设置校验的话,数据会乱,这里就不截图了。
最后处理方式也很简单,串口收到的每个字节的数据&=0x7F即可。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分