| 
 
| 本帖最后由 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);
 }
 
 
 | 
 |