在串口通信中,现在已经很少用到奇偶校验位的应用了,手头的项目有个赛多利斯的精密天平要用,该天平的RS232的通信协议中使用到了奇校验位, 还是在多年前搞51的搞过奇偶校验位,有点模糊了,在网上查了一下资料,写的不是很清楚明白,自己再重新整理一下,做个MARK吧。 一般奇偶校验位的应用是由硬件完成的,软件只需要在初始化的时候对MCU的串口外设设置一下OK了。
奇偶校验的形式一般是在数据位后面跟一个奇偶校验位,如果数据位是8位的,那么加上校验位就是9位数据;如果数据位是7位的,那么加上校验位就是8位数据,校验位和数据之间没有任何意义上的关联,它不是数据的一部分,它只是关心数据中的“1”的个数是否为奇数(奇校验),或者偶数(偶校验),先说奇校验吧,奇校验就是控制器在发送的一个字节或者一个数据帧里面含有的“1”的个数进行奇数个的修正调整,这里采用8位数据位+1位奇校验位的形式举个简单的例子,A发送数据0x35到B,后面紧跟一个奇校验位J, 0x35的二进制= 0011 0101,可以看出8个数据位中一共有4个‘1’,那此时硬件会根据“1”的个数来设置J,这里会将奇校验位J调整为“1”,为什么呢? 因为数据位的“1”的个数是偶数,而我们用的是奇校验,所以为了达到有奇数个“1”的目的,调整奇偶校验位J为“1”,那么这9个位发出去就有奇数个“1”啦,当B接收的时候,B的硬件同样会对接收到“数据+J”中“1”的个数进行计数判断,如果是奇数个“1”,则认为数据接收正确,否则认为数据错误。而当A发送数据0x25( 0010 0101)到B的时候,则J应该就是“0”了,因为要保证发送出去的数据位+J位一共有奇数个“1”。
偶校验和奇校验是一个故事来着,不多啰嗦了!