从串口发送数据包问题 包头是:"f",包尾是:"*";在包尾后是一个校验和,有的时候计算出来的校验和和包尾是一样的,在接收就会有错,遇到*就会break;请问如何解决。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的校验和是在包尾之后的吗?如果是这样那怎么又会出错呢?搜索包头f,找到后向后搜索包尾*(中途碰到f则以新的f作为包头),遇到*就认为是包尾,然后读取后面的2字节作为校验和,完成后继续搜索包头好像不会出错呀 我的校验和是在包尾之后比如我发送的数据包是:"f12345**";这个是整个数据包,当我接收数据时这样写的:该怎么改case 'f': checksum=0; flag=0; break;case '*'://后面接收到的是校验和但是又是*,又执行这段代码,根本没有接收到校验和 flag=1; break; 应该将校验和放在‘*’的前面,这是一个方法另一个就是当你接受到第一个‘*’的时候,先不要break;设置一个标志,允许再接收一个字节,然后再break; 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; } 不好意思,上面弄错了,:-)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; } 在VC6中调用我自编的静态链接库(snmp++编译生成的库文件)出现unresolved externals错误 请问有什么办法或者工具可以获得DLL文件中的导出的函数的原型 请问如何优化大量实时数据转发程序 详情请进 vb 调用 vc dll 返回数组为空值 关于映射网络驱动器!! 如何选择何种类型的数据库!急 getservbyname getservbyport这些函数是干什么用的 请问各位高手,给出调试出错信息如下,望指点. 普通用户怎么在系统盘创建文件 Iocomp控件如何在vc环境下安装 请问怎样打开对话框? 毕业设计--变速器设计专家系统
case 'f':
checksum=0;
flag=0;
break;
case '*'://后面接收到的是校验和但是又是*,又执行这段代码,根本没有接收到校验和
flag=1;
break;
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;
}
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;
}