子线程:设置定时器,超时就接受数据接受数据并解析,然后把解析的数据传给主线程。
主线程:打开串口,将子线程传的数据在界面显示。
子线程代码:
timer2 = new QTimer; connect(timer2,SIGNAL(timeout()),this,SLOT(open20msbt()));
timer2->start(5);
void agvworker::do20msdatareciveWork()
{
if(serial->isOpen())
{
// qDebug()<<"接受数据并解析";
if(serial->bytesAvailable()>=48)
{
serial->read((char*)agv_RXRobotData20MS.data,48);
u16 TempCheck=0;
for(u8 i=0;i<sizeof(agv_RXRobotData20MS.data)-2;i++)
{
TempCheck += agv_RXRobotData20MS.data[i];
}
//头和校验正确
if(agv_RXRobotData20MS.prot.Header == HEADER && agv_RXRobotData20MS.prot.Check == TempCheck)
{
QByteArray senddata ;
senddata.append((char *)&agv_RXRobotData20MS,sizeof(agv_RXRobotData20MS));
emit sendResultToGui(senddata);
memset(agv_RXRobotData20MS.data,0,sizeof(agv_RXRobotData20MS.data));
}
else
{
serial->readAll();
// qDebug()<<"解析错误";
}
}
}
}
void agvworker::open20msbt()
{
do20msdatareciveWork();
}
主线程:
//设置串口名
serial_2.setPortName(ui->serial_comboBox->currentText());
//设置波特率
serial_2.setBaudRate(ui->rate_comboBox->currentText().toInt());
//设置数据位数
switch(ui->data_comboBox->currentIndex())
{
case 8: serial_2.setDataBits(QSerialPort::Data8); break;
default: break;
}
//设置奇偶校验
switch(ui->check_comboBox->currentIndex())
{
case 0: serial_2.setParity(QSerialPort::NoParity); break;
default: break;
}
//设置停止位
switch(ui->stop_comboBox->currentIndex())
{
case 1: serial_2.setStopBits(QSerialPort::OneStop); break;
default: break;
}
//设置流控制
serial_2.setFlowControl(QSerialPort::NoFlowControl);
//打开串口
if(!serial_2.open(QIODevice::ReadWrite))
{
QMessageBox::about(NULL,"提示","无法打开串口!");
return;
}
//新建串口处理线程
agvworker *agvWorker = new agvworker(&serial_2);
agvWorker->moveToThread(&serialthread_2);
//连接信号和槽
connect(&serialthread_2, &QThread::finished,agvWorker, &QObject::deleteLater); //线程结束,自动删除对象
connect(this,&agv::sig_open20ms,agvWorker,&agvworker::open20msbt); //主线程发送点击信号传给子线程循环读取数据
connect(agvWorker,&agvworker::sendResultToGui,this,&agv::handleResults); //子线程发送数据到主线程
//线程运行
serialthread_2.start();
// 退出串口2子线程
serialthread_2.quit();
serialthread_2.wait();