本帖最后由 dengxbin 于 2015-4-7 20:11 编辑
用PIC单片机写了个串口通讯,自己加了个异或校验,校验规则是数据头:0xAA,命令位:xx,数据位:xx,校验位XOR.校验程序如下:
if (queue[0] == UART_BEGIN_STR) // 查找数据头
{
uchar checksum = 0;
for (uchar index = 0; index < 3; index++)//异或校验
{
checksum ^= queue[index];
}
if (checksum != queue[3]) //如果数据校验失败,丢弃这一包数据
{
Tr_byte(0xF1); //校验失败往串口发送0XF1
for(uchar i=0;i<3;i++)//从缓存中删除错误数据
{
del_queue();
}
continue;//继续下一次循环
}
Tr_byte(0xA1); //校验成功发送 0XA1
后边还有 没粘贴完,就是如果不是数据头就删除。queue是我定义的一个队列,串口接收到的数据全部放到队列里边去,再慢慢出队列。
很诡异的是,一条正常的指令重复发送,总是异或校验失败率很高,差不多传回两次正常数据就有一次0XF1,为了找出哪里失败,我在异或校验处
加了这几个标记语句。
uchar checksum = 0;
for (uchar index = 0; index < 3; index++)//异或校验
{
Tr_byte(queue[index]);
checksum ^= queue[index];
Tr_byte(checksum);
}
很神奇的是,再也没有0XF1返回了,校验一直成功。。。。。
把这段话删掉又会导致原来的问题,实在不解,求大神相助~~!!
PS: void Tr_byte(uchar dat) //Tr_byte函数定义
{
TXREG=dat;
while(!TRMT);
}
|