QT串口接收数据处理

   以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.  帧头,帧尾处理:即在每条消息的首部和尾部均添加标志,适用于消息长度不固定的场景。

发布了11 篇原创文章 · 获赞 8 · 访问量 164

猜你喜欢

转载自blog.csdn.net/qq_37730663/article/details/105269994
今日推荐