qt实现串口通信(多线程)

子线程:设置定时器,超时就接受数据接受数据并解析,然后把解析的数据传给主线程。
主线程:打开串口,将子线程传的数据在界面显示。

子线程代码:

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();
  • 1
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值