以ReadyRead为接收的标志时容易造成数据混乱,比如用串口循环发送两条消息:“123”和“456”,如果在不对接收做出护理的话可能接收到的就是”234“和”561“,就失去了信息的真实性,因此处理添加一些标志 就可避免此类问题。
1. 单帧尾处理:即在每条消息的尾部添加标志,本例是以”#“为消息结束的标志,该方法适用于固定长度的消息
//串口接收
void MainWindow::serialPort_readyRead()
{
QByteArray temp = myUart.readAll();
if(!temp.isEmpty())
{
byteArray.append(temp);//在字符串后面增加字符
if(byteArray.contains("#"))//是否含有这一字符串 是的话返回1
{
int nIndex = byteArray.indexOf("#"); //表示“#”之前有nIndex位
byteArray = byteArray.left(nIndex); // 取前nIndex位
byteArray = byteArray.right(12); //
if(byteArray.size() == 12)
{
char *bufRecv = byteArray.data();
CodeEorCh0 = (bufRecv[0]<<8) + bufRecv[1];
CodeEorCh1 = (bufRecv[3]<<8) + bufRecv[4];
CodeEorCh2 = (bufRecv[6]<<8) + bufRecv[7];
CodeEorCh3 = (bufRecv[9]<<8) + bufRecv[10];
LockStateCh0 = bufRecv[2];
LockStateCh1 = bufRecv[5];
LockStateCh2 = bufRecv[8];
LockStateCh3 = bufRecv[11];
byteArray.clear(); //更新完数据,清空缓存区
}
}
}
2. 帧头,帧尾处理:即在每条消息的首部和尾部均添加标志,适用于消息长度不固定的场景。