QT做的串口助手,子线程里waitforreadyread的问题
看不破说破 2019-01-16 05:25:00 1.问题:
QT做的串口助手,主线程主要管理 GUI界面及打开、关闭、初始化串口;子线程用阻塞的方式读取串口数据;问题是子线程读数据时阻塞里面用readALL和read读出来的数据有时正确,有时是双份的。
例如:用虚拟串口测试(COM3/COM11),COM11发数据(用网上的稳定完善的串口助手),COM3收数据(用自己写的串口助手);COM11发送 “1”,COM3有时收到“1",有时收到"11",发的次数多了更可能收到"111"。
2.代码:
直接贴核心问题所在的代码。
mythread.cpp
#include "mythread.h"
#include<QThread>
#include<qDebug>
myThread::myThread(QObject *parent) : QObject(parent)
{
isStop = false;
qDebug()<<"子"
"线程号:"<<QThread::currentThread();
}
void myThread::myTimeout(QSerialPort *sendSerialPort)//线程处理函数
{
qDebug()<<"哪个线程号:"<<QThread::currentThread();
int num = 0;
QByteArray readbuff;
while(isStop == false)
{
if((sendSerialPort)->waitForReadyRead(13) == true)
{
num = (sendSerialPort)->bytesAvailable();
//qDebug()<<"串口数据个数:"<<num<<endl;
readbuff = (sendSerialPort)->read(num);
(sendSerialPort)->clear();
if(num >= 1)
{
emit mySignal(readbuff);
// qDebug()<<"从串口读到的数据:"<<tr(readbuff)<<endl;
}
/*
num = (sendSerialPort)->bytesAvailable();
QByteArray readbuff;
readbuff.append(sendSerialPort->readAll());
// while(sendSerialPort->waitForReadyRead(20))
// readbuff.append(sendSerialPort->readAll());
if(num >= 1)
{
emit mySignal(readbuff);
qDebug()<<"从串口读到的数据:"<<tr(readbuff)<<endl;
}
*/
}
}
}
void myThread::setFlag(bool flag)
{
isStop = flag;
}
3.报错信息:无
4.尝试过的方式、方法:
(1) 一直感觉是readAll 和 waitforreadyread的问题。
为了排除是线程的问题,用改写run的方法创建了线程,还是一样的现象。
在主线程里无法用阻塞读写,不然无法执行软件界面。
所以不是线程问题。
(2) 在while循环里面,隔多少秒读一次串口数据(非阻塞),没有任何问题,都是完善的;但是我想要的是阻塞读能正确读取串口数据。
(3). read和readAll都试过,现象一样不行。
5.相关截图:
截图不用了,没什么用,是思想问题,不是表面的报错问题。
特别提示:个人感觉问题主要在 mythread.cpp 的mytimeout函数(线程处理函数)里面(mytimeout名字乱起的,不用理会其意思)。 用/* */ 注释的不用太理会。
希望有大佬能帮忙解决,谢谢。