新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > 奇偶校验你会用吗?

奇偶校验你会用吗?

作者:jobs时间:2015-09-21来源:电子产品世界收藏

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

本文引用地址:http://www.eepw.com.cn/article/280413.htm

  我们先来看一下F030的串口初始化程序,程序清单如下:

  USART_InitStructure.USART_BaudRate = 115200; 波特率

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;数据位8位

  USART_InitStructure.USART_StopBits = USART_StopBits_1;停止位1位

  USART_InitStructure.USART_Parity = USART_Parity_No;位无

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;无硬件流控制

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;使能发送与接收功能

  USART_Init(USART1, &USART_InitStructure);初始化串口1

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

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

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

  误区一:修改一下串口配置参数就可以了吗?

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

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

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

  USART_InitStructure.USART_WordLength = USART_WordLength_9b;

  USART_InitStructure.USART_Parity = USART_Parity_Odd;

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

  误区二:PC机串口软件无法实现奇偶校验发送?

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

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

  误区三:STM32F030配置了奇偶校验位,就不会接收到错误的字节了

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

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

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

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

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

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



关键词: 奇偶校验 STM32

评论


相关推荐

技术专区

关闭