QSerailPort使用readAll()接收数据不完整
比如实际发送十六进制数据:
BB 01
接收数据:
BB
01
一次接收不完整,分多次接收;
我这里接收的数据是有固定的包头,固定的包长;
网上的方法基本试过了,没有解决;
我们可以对包头,包长的判断对数据完整的显示;
if(tempData.contains("bb")) //是否有“bb”
{
if(tempData.length() < xx) //xx数据长度
{
temp = tempData; //将不完整的数据保存在temp
return;
}
temp = tempData; //若完整,直接赋值
}
else
{
temp += tempData; //累加不完整数据
if(temp.length() < xx) //xx数据长度
{
return;
}
}
除了上述的方法,还可以这样写:
char BUF[100] = {0}; //接收数据存储转换类型后的数据
char *BUFTEMP;
int len;
data_1 += serial1->readAll(); //读取数据readAll(),readLine(),read()
len = data_1.toHex().size();
//qDebug() << "len:"<< len;
if(len < 40){
return;
}
BUFTEMP = data_1.toHex().data();
strncat(BUF,BUFTEMP,len);
通过协议的长度加一个限制,到达协议的实际长度时,再进行解析!
否则解析协议会出错;