Qt串口处理数据丢包问题
2017-12-29 16:04
871 查看
(1)问题说明
程序通过串口接收字节数组,转化为各种数据。但实际应用中发现这个接收程序丢失了很多包数据。
(2)程序结构:
1.将串口类的readyRead信号连接到自定义的readData函数
(3)问题分析
进一步调试现象:我调试过程中发现我发一包58个字节的数据包到串口,这个接收程序只进入readData函数一次。
分析:我觉得是我对QSerialPort类的readyRead信号理解错误,这个信号会在串口上接收到新数据时触发,而不是只要串口上的数据没有被读取完就会一直触发。
(4)解决方法:修改程序结构
readData函数中将串口上的所有数据都读取下来,读到一个字节数组中。
ProcessInputData(QByteArray InputData)函数中既进行数据转化,也进行开始位检测。
程序通过串口接收字节数组,转化为各种数据。但实际应用中发现这个接收程序丢失了很多包数据。
(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)函数中既进行数据转化,也进行开始位检测。
相关文章推荐
- (2)Qt中串口的数据处理
- 如何处理串口通讯数据重合与分批到达的问题
- Qt串口持续输入数据,上位机接收端未响应问题
- 遇到的问题(一):智能家居中WIFI模块设备在接收底层家具设备串口数据时由于断帧而出现的指令丢失的情况处理
- 如何处理串口通讯数据重合与分批到达的问题 2
- Qt串口接收数据长度不稳定问题
- vxworks RS422串口接收大数据格式包丢包问题
- Qt从零开始制作串口调试助手-(第十章、串口接收数据处理)-Creator_Ly
- RS485通信字符串数据接收处理的问题
- 蓝牙串口返回数据过长分包的问题
- 使用drving_site处理DBLINK数据的无数据的问题
- 串口收发数据时候的高低位问题
- PHP array_map() 处理数组的单元数据问题
- 学习springMVC框架配置遇到的问题-数据写入不进数据库时的处理办法
- 如何处理javascript中var类型有效数据极限值问题(超大数据)
- STM32 ucosii 串口接收数据 遇到的问题及解决思路
- 并发问题,锁,怎么处理死锁,脏数据处理
- Arm下使用Qt和Opencv进行图像处理的入门例程和遇到的问题
- linux串口数据传输出现问题的几点总结
- 使用用VB处理MYSQL数据库中二进制数据问题