stm32串口奇偶校验时出现bug总结

时间:2024-03-16 17:49:29

做的是工业传感采集器,现场采集的参数查询指令为FE FE 68 19 01 00 00 00 00 33 78 01 03 1F 90 01 E1 16 ,8位数据位,奇校验模式

串口设置:

            USART_InitStructure.USART_WordLength = USART_WordLength_8b;
            USART_InitStructure.USART_Parity = USART_Parity_Odd;

代码写入:   

 index = 0;
    Max3485SendBuf[index++] = 0xfe;
    Max3485SendBuf[index++] = 0xfe;
    Max3485SendBuf[index++] = 0x68;
    Max3485SendBuf[index++] = 0x19;
    Max3485SendBuf[index++] = 0x01;
    Max3485SendBuf[index++] = 0x00;       
    Max3485SendBuf[index++] = 0x00;
    Max3485SendBuf[index++] = 0x00;
    Max3485SendBuf[index++] = 0x00;
    Max3485SendBuf[index++] = 0x33;
    Max3485SendBuf[index++] = 0x78;
    Max3485SendBuf[index++] = 0x01;
    Max3485SendBuf[index++] = 0x03;
    Max3485SendBuf[index++] = 0x1f;
    Max3485SendBuf[index++] = 0x90;
    Max3485SendBuf[index++] = 0x01;
    Max3485SendBuf[index++] = 0xe1;
    Max3485SendBuf[index++] = 0x16;
    UART4_SendLongData(Max3485SendBuf, index);

用串口调试工具接收到的数据确是:

stm32串口奇偶校验时出现bug总结

一直怀疑是不是现场采集的校验方式错了,或者是其他什么问题。后来根据发送接收的数据对比,发现接收的数据是把最高位

变成校验位了。查看数据手册发现stm32的设置数据长度是把校验位算在一起的,所以上图设置的数据长度8位,其实是7位y有效数据位,1位停止位。而接收端设置的是8位有效数据位,1位停止位。所以在发送的时候把校验位覆盖掉了最高位。

改为

            USART_InitStructure.USART_WordLength = USART_WordLength_9b;
            USART_InitStructure.USART_Parity = USART_Parity_Even;