打印

求助,单片机校验失败

[复制链接]
1057|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengxbin|  楼主 | 2015-4-7 20:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
}

相关帖子

沙发
huangxz| | 2015-4-7 20:32 | 只看该作者
这两句的作用仅是延长时间,没有本质的改变数据。楼主还是联系上下文看看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

98

帖子

3

粉丝