有的单片机串口奇偶校验都是硬件自动完成的,但是就我目前用到的很多51核的单片机,需要软件做一些简单的处理来完成奇偶校验。
可以自己写一个简单的小程序来实现:一位一位的判断1的个数,这个当然好实现,但是51核本身有特殊功能的寄存器可以帮助我们来实现这个功能,减少运算量。只需用好 ACC 和 P 就能实现。
奇校验:原数据+校验位 为奇数个1
偶校验:原数据+校验位 为偶数个1
void uart4_meter_int() interrupt UART4_VECTOR
{
u8 even;
u8 tmpP;
u8 tmpBuf;
if(RI4)
{
CLR_RI4();
if (meterCnt < sizeof(meterBuf)) //接收缓冲区尚未用完时,
{
even = (S4CON & 0x04)>>2;
tmpBuf = S4BUF;
ACC = tmpBuf;
tmpP = P; //这个必须跟在ACC的下面
if(even==tmpP) //偶效验
{
meterBuf[meterCnt++] = tmpBuf; //保存接收字节,并递增计数器
}
}
}
if(TI4)
{
CLR_TI4();
}
}
ACC是累加器
P是PSW-----程序状态字的一个位,表示奇偶校验位:它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。 运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。