当前位置: 首页 > 乐球直播在线
返回
列表

奇偶校验你会用吗?

发表时间: 2024-04-12 作者: 乐球直播在线

  在工作中调试通讯时,发现有诸多的干扰数据出现,想想串口通讯除去外部硬件电路去除干扰外,还能够最终靠软件来滤掉干扰数据,于是我就想到了串口通讯中的F030程序初始化串口时,对其配置的时候有一个属性是否使用奇偶检验。我想,只需要简单修改一下这一个属性,程序便大功告成了。可是结果真的是我所预料的吗?请看下文。

  上面这段程序没有特别之处,广泛示例于各大论坛,教程,而笔者也只是将上面奇偶校验位这一行,修改为了USART_InitStructure.USART_Parity = USART_Parity_Odd;即奇校验。然后,重新编译,下载,一切正常。可是

  从图1可以清楚看到,在未修改之前,串口能正常接收到字符串,但是在修改之后,取而待之的都是乱码。无论PC机软件配置为奇校验,偶检验,还是无奇偶校验均无正确显示。顿时,整个人的感觉就不好了。555

  笔者也是借此机会进一步探索了一下奇偶校验,与STM32F030芯片上的实现。现在将奇偶校验认识的三大误区及应用实现分享给大家。

  这个误区我觉得应该放在第一位,主要因为笔者首先就这样认为的。通过上面的实例,也已经充分说明仅修改一个属性是没办法实现的。通过仔细阅读编程手册,发现在配置奇偶校验属性后,必须要修改数据位为9位,否则PC端无法接收。以下是笔者查询到的资料(STM32F10xxx参考手册):

  通过上面的截图(图2),我们大家可以看到,如果将串口配置为了奇校验,且数据位为8位,那么数据位的位7将被替换为奇检验位也就是说,原有的数据被破坏了。这也就证明了图1为何会出现乱码的现象了。

  既然发现了错误,那就要解决。通过查询相关文档,与详细阅读STM32芯片编程手册,最后通过以下配置就可以实现正常发送,与奇偶校验。程序配置清单如下:

  如果将数据位数扩展成9位,那么奇偶校验位将占用新插入的位8,也就不必破坏原数据。通过编译与下载程序,并在PC机上验证,此方法确实可行,PC机数据正常接收,再次重现”Hello EEPW”。

  笔者在查阅资料的时候发现有好多网友都有这样的观念,但是笔者的PC机软件的确是可以发送奇偶检验的。通过多次实验笔者发现,SScomm串口工具软件v3.2版本没办法实现,但SScomm版本v4.2可以实现。

  虽然说是实现奇偶校验,但是仅限发送时会发送严格按照配置要求发送,即会发送奇偶校验位,从而下位机将正常接收。但是接收的时候,并不表示奇偶校验位错误,上位机不会接收数据上位机的具体实现也是这样的。上位机不管奇偶校验是不是正确,仍然会正常显示接收的数据,这个并不影响我们实际应用,也只是说明一下而已。

  很遗憾,这个也是非常大的误区。通过在线配置为奇校验,无论上位配置了哪一项,均能正常接收到数据。但是,还是有不同的地方的。如果奇偶校验开启后,当发生奇偶校验错误时,会触发硬件奇偶校验失败事件,如果开启了奇偶校验失败中断,那么硬件将进入奇偶校验中断。

  以上三个误区笔者已经全部分析完毕,那么下面我们将如何针对STM32F030芯片的特性来实现串口通讯奇偶校验呢?

  在下位机软件上,通过误区一的分析,我们应该将下位机STM32F030的串口配置为数据位9位,奇检验或偶检验,然后开启奇偶校验位异常中断。再通过奇偶校验异常中断中将此次接收到的数据丢弃,以实现错误字节的滤除。这里要格外的注意,开启奇偶校验中断一定要优先配置,至少要在接收中断开启之前,具体原因笔者尚未能查询到。

  至于硬件做了些什么,硬件仅仅填充了奇偶校验位,并提示了错误信息,其并不会为我们主动去除接收的数据。

  对于PC机上的串口软件,我们并不是特别需要设置成为数据位9位,而是必须配置成数据位8位当然,在笔者下载的几款串口工具软件里均无法配置成数据9位。相应的奇偶校验位需要与下位机相同即可。

  经过以上的软件配置,现在基于STM32F030芯片的通讯已经工作正常了,我的经验也暂时总结到这里了。