STM32H7 : 7数据位 + 校验 过程和问题记录

时间:2024-04-04 15:53:35

STM32H7 : 7数据位 + 校验 设置过程和问题记录

首先是设置寄存器,按正常设置走就可以,唯一需要注意的地方是串口CR1寄存器的字长设置:
根据帧格式表可以看到,9位数据和8位数据+1位校验所设的M位值相同STM32H7 : 7数据位 + 校验 过程和问题记录

所以在CR1寄存器中字长位寄存器的描述,这里所写的数据位其实是指我们平时所说的数据位+校验位
STM32H7 : 7数据位 + 校验 过程和问题记录
即:
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:STM32H7 : 7数据位 + 校验 过程和问题记录
这就很奇怪了,按道理来说,7数据位下不应该存在大于0x7F的数据。
一开始怀疑是串口工具的问题,拿逻辑分析仪抓了下串口的TTL端,数据是正确的。
STM32H7 : 7数据位 + 校验 过程和问题记录
但也非常容易发现,发生错误的数据0x33,因为奇校验的关系,校验位为1,而10110011刚好为0xB3,所以猜测是单片机将校验位的bit当成了8位数据位里的最高位处理了。

改成偶校验验证猜想:
STM32H7 : 7数据位 + 校验 过程和问题记录

STM32H7 : 7数据位 + 校验 过程和问题记录

直接在逻辑分析仪上改为N/8/1解析,完全正确:STM32H7 : 7数据位 + 校验 过程和问题记录

因此基本可以验证猜想:单片机在7数据位+校验位的设置下,将校验位当做8位数据位里的最高位给处理了,校验位为1时就会导致数据错误。

如果直接将字长寄存器改为7,同时又设置校验的话,数据会乱,这里就不截图了。

最后处理方式也很简单,串口收到的每个字节的数据&=0x7F即可。