包头是:"f",包尾是:"*";在包尾后是一个校验和,有的时候计算出来的校验和和包尾是一样的,在接收就会有错,遇到*就会break;请问如何解决。

解决方案 »

  1.   

    你的校验和是在包尾之后的吗?如果是这样那怎么又会出错呢?搜索包头f,找到后向后搜索包尾*(中途碰到f则以新的f作为包头),遇到*就认为是包尾,然后读取后面的2字节作为校验和,完成后继续搜索包头好像不会出错呀
      

  2.   

    我的校验和是在包尾之后比如我发送的数据包是:"f12345**";这个是整个数据包,当我接收数据时这样写的:该怎么改
    case 'f':
    checksum=0;
    flag=0;
    break;
    case '*'://后面接收到的是校验和但是又是*,又执行这段代码,根本没有接收到校验和
    flag=1;
    break;
      

  3.   

    应该将校验和放在‘*’的前面,这是一个方法另一个就是当你接受到第一个‘*’的时候,先不要break;设置一个标志,允许再接收一个字节,然后再break;
      

  4.   

    case '*'://后面接收到的是校验和但是又是*,又执行这段代码,根本没有接收到校验和
    if(flag == 0)
    {
    //碰到包尾,开始接收校验字节
    flag = 1;
    break;
    }
    else if(flag == 1)
    {
    //接收第1个校验字节
    checksum[0] = c;
    flag=2;
    break;
    }
    else //if(flag == 2)
    {
    //接收第2个校验字节
    checksum[1] = c;
    //接收完毕,检查包是否正确接收
    ...
    //处理正确收到的包
    ...
    SetEvent();
    //继续新的搜索
    flag=-1;
    break;
    }
      

  5.   

    不好意思,上面弄错了,:-)case 'f':
    checksum=0;
    flag=0;
    break;
    case '*':
    if( flag == 0 )
    {
    //包尾,开始接收校验字节
    flag=1;
    break;
    }
    //此处不使用break;这样当flag!=0时收到'*'仍可进行下面的工作
    default:
    if( flag == 1 )
    {
    //接收校验字节
    checksum = c;
    //检查包是否正确接收,处理正确收到的包
    ...
    //继续新的搜索
    flag=-1;
    break;
    }
    else if( flag == 0 )
    {
    //正常数据,储存之
    buffer[num++] = c;
    break;
    }