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

做的是工业传感采集器,现场采集的参数查询指令为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的设置数据长度是把校验位算在一起的,所以上图设置的数据长度8位,其实是7位y有效数据位,1位停止位。而接收端设置的是8位有效数据位,1位停止位。所以在发送的时候把校验位覆盖掉了最高位。

改为

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

 

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值