您的位置:首页 > 编程语言 > Qt开发

Qt串口处理数据丢包问题

2017-12-29 16:04 871 查看
(1)问题说明

程序通过串口接收字节数组,转化为各种数据。但实际应用中发现这个接收程序丢失了很多包数据。

(2)程序结构:

1.将串口类的readyRead信号连接到自定义的readData函数

connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData);
2.readData函数:数据包格式为2位开始位,这个函数中使用有限状态机方法实现开始位判断。

void MainWindow::readData()
{

qDebug()<<"getmessage";
switch (data_status) {
case 0:
tempdata=serial->read(1);
memcpy(&start_flag,tempdata,1);
if(start_flag==160)
{data_status=1;//检测到第一个标志位
}
break;
case 1:
tempdata=serial->read(1);
memcpy(&start_flag,tempdata,1);
if(start_flag==161)
{data_status=2;//检测到第二个标志位
}
else
{
data_status=0;
}
break;
case 2:
if(serial->bytesAvailable()>=56)
{tempdata=serial->read(56);
ProcessInputData(tempdata);
data_status=0;//没有检测到一个标志位
}
break;
default:
break;
}

}
3.ProcessInputData函数:这个函数的说明参照我之前的帖子“ (2)Qt中串口的数据处理”

void MainWindow::ProcessInputData(QByteArray inputdata)//函数说明:将串口接收到的字节数组inputdata转化为各种数据类型的数据
{
QByteArray data1;

data1=inputdata.left(4);<span style="white-space:pre">      </span>
memcpy(&acceleration_x,data1,4);   //之前定义的变量  float acceleration_x;
inputdata.remove(0,4);

data1=inputdata.left(4);
memcpy(&acceleration_y,data1,4);  //之前定义的变量   float acceleration_y;
inputdata.remove(0,4);
}


(3)问题分析

进一步调试现象:我调试过程中发现我发一包58个字节的数据包到串口,这个接收程序只进入readData函数一次。

分析:我觉得是我对QSerialPort类的readyRead信号理解错误,这个信号会在串口上接收到新数据时触发,而不是只要串口上的数据没有被读取完就会一直触发。

(4)解决方法:修改程序结构

readData函数中将串口上的所有数据都读取下来,读到一个字节数组中。

ProcessInputData(QByteArray InputData)函数中既进行数据转化,也进行开始位检测。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: