QT多线程串口开发总结

                                                                                                           QT多线程串口开发总结

1、优势

          使用多线程技术可以充分发挥CPU的性能,我们在主线程上面绘制UI和一些简单的工作(信号之间的传递等等)、在子线程中完成庞大数据的处理。

2、串口类构建

        在串口类中封装串口的一系列接口函数。串口的初始化函数、接收缓冲区数据、数据处理函数。

3、主线程构建

        在主线程中构建界面UI和一些简单的操作,以及完成串口的初始化,并创建串口数据处理子线程。

4、子线程创建过程

      新建线程变量-->将需要加入的类移动到线程中-->运行该线程-->发送线程运行信号-->槽函数即是该线程要处理的工作

    m_objThread= new QThread(); //新建一个子线线程
    myport.moveToThread(m_objThread);   //将串口类加入到m_objThread线程中
    m_objThread->start();  //运行子线程
    emit StartPortThread();  //发送运行子线程信号
    //连接线程运行信号和槽
     connect(this,&MainWindow::StartPortThread,&myport,&SerialPort::PortThread);
    void SerialPort::PortThread()
    {
          while(1)
        {

            //if(线程退出条件)
        }
    }

    
    
注意:
connect(&myport.serialport,SIGNAL(readyRead()),&myport,SLOT(readdate()),Qt::DirectConnection);

connect函数的最后一个参数默认是:Qt::AutoConnection自动连接,当我们的信号和槽函数处于同一线程时使用默认值会导致槽函数不能触发(原因没找到)可以使用Qt::DirectConnection参数即可 解决无法触发槽函数的问题。

5、串口接收缓冲区数据处理问题

       只有调用serialport.readAll()才能清空缓冲区,如果缓冲区的数据我们不需要那么我们也要调用一次serialport.readAll()函数顺便的将缓冲区不要的数据清空,若不调用此函数那么我们不需要的数据会一直存在于缓冲区中知道调用serialport.readAll()函数才会被清空(此时的数据中包含有我们不需要的垃圾数据)。

          if(ReceiveBuff.length()<MAXLENTH)
          {
              ReceiveBuff+=serialport.readAll();//读取缓冲区内的所有数据
           }
          else
          {
              serialport.readAll();//读取超出MAXLENTH 缓冲区中的数据,qt缓冲区中的数据只有调用                        
            该函数才会被清掉
          }

6、数据转换16转QString、16转10进制、10进制转QString

         16进制转QString:

QString SerialPort::_16ToString(QByteArray _16Data)
{
    QString str = _16Data.toHex();
    return str;
}

      16进制转10进制

int SerialPort::_16To10(QByteArray _16Data)
{

    return  _16Data.toInt(0,16);
}

        10进制转QString

StrData+=QString::number(current_time.hour());

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值