精华内容
下载资源
问答
  • QT串口多线程总结

    万次阅读 2018-01-04 11:21:54
    Qt串口个人感觉不是很好用。 大体使用步骤如下: 1.在.pro文件中加入  QT+=serialport 2.添加头文件 #include #include 3.编写收发程序 write和readAll 方法实现读写程序 QT 读写可分为阻塞方式和非...

    Qt的串口个人感觉不是很好用。

    大体使用步骤如下:

    1.在.pro文件中加入 

    QT+=serialport

    2.添加头文件

    #include<QtSerialPort/qserialport>
    #include<QtSerialPort/QSerialPortInfo>

    3.编写收发程序

    write和readAll 方法实现读写程序


    QT 读写可分为阻塞方式和非阻塞方式

    阻塞方式:通过查询缓冲区是否有数据

    waitForReadyRead(int timeout) 当缓冲区有一个字节数据的时候此函数就会返回 true;timeout为最大等待超时时间,若timeout为-1 则阻塞到有数据为止。

    waitForBytesWriten(int timenout);当数据全部写完时返回1;

    bytesAvailable(); 返回缓冲区已有的字节数;

    使用这三个方法可实现阻塞方式读写串口;

    Example:

    if(Mpor->waitForReadyRead(300))

    {

    QByteArray readbuff;

    readbuff.append(Mport->readAll());

    while(Mpor->waitForReadyRead(20))

    readbuff.append(Mport->readAll());

    }

    非阻塞式:分两种一、在子线程中读写串口;二、使用qt的信号槽机制

    在子线程中读写:

    QThread 类的run方法中实现读写即可;

    Example:

    class MyThread:public QThread

    {

    Qserialport *Mport;

    ...

    public void run();

    }

    重写run()方法

    在run方法中new Qserialport对象,初始化Mport,然后读写串口。

    信号槽机制:

    如果是在主线程中完成则只需要

    connect(sender,signal,receiver,slot);即可; sender 和receiver 一般是本对象(this)

    如果在子线程中则:

    Qserialport对象必须在子线程中创建,而且最好自己手动 emit signal;

    void run()

    {

    new Qserialport;

    Init();

    connect(sender,signal,receiver,slot);

    Mwrite()

    {

    Mport->write(bytesarray);

    emit msignal();

    }

    }


    注意:

    子类方法中使用connect时 需要在子类中 声明 Q_OBJECT  然后重新运行qmake(构建->执行qmake) 

    写的不够完善,大体意思如此,不完善的地方有待学习.....











    展开全文
  • Qt下实现多线程串口通信

    千次阅读 2019-05-20 07:19:37
    Qt下实现多线程串口通信 Qt下无论是RS232、RS422、RS485的串口通信都可以使用统一的编码实现。本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现。 用SerialPort类实现串口功能,Widget类调用...

    Qt下实现多线程串口通信

    Qt下无论是RS232RS422RS485的串口通信都可以使用统一的编码实现。本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现。

    SerialPort类实现串口功能,Widget类调用串口。

    serialport.h如下:

    #include <QObject>

    #include <QSerialPort>

    #include <QString>

    #include <QByteArray>

    #include <QObject>

    #include <QDebug>

    #include <QObject>

    #include <QThread>

     

    class SerialPort : public QObject

    {

      Q_OBJECT

    public:

      explicit SerialPort(QObject *parent = NULL);

      ~SerialPort();

     

      void init_port();  //初始化串口

     

    public slots:

      void handle_data();  //处理接收到的数据

      void write_data();     //发送数据

     

    signals:

      //接收数据

      void receive_data(QByteArray tmp);

     

    private:

      QThread *my_thread;

      QSerialPort *port;

    };

    serailport.cpp如下

    #include "serialport.h"

     

    SerialPort::SerialPort(QObject *parent) : QObject(parent)

    {

        my_thread = new QThread();

     

        port = new QSerialPort();

        init_port();

        this->moveToThread(my_thread);

        port->moveToThread(my_thread);

        my_thread->start();  //启动线程

     

    }

     

    SerialPort::~SerialPort()

    {

        port->close();

        port->deleteLater();

        my_thread->quit();

        my_thread->wait();

        my_thread->deleteLater();

    }

     

    void SerialPort::init_port()

    {

        port->setPortName("/dev/ttyS1");                   //串口名 windows下写作COM1

        port->setBaudRate(38400);                           //波特率

        port->setDataBits(QSerialPort::Data8);             //数据位

        port->setStopBits(QSerialPort::OneStop);           //停止位

        port->setParity(QSerialPort::NoParity);            //奇偶校验

        port->setFlowControl(QSerialPort::NoFlowControl);  //流控制

        if (port->open(QIODevice::ReadWrite))

        {

            qDebug() << "Port have been opened";

        }

        else

        {

            qDebug() << "open it failed";

        }

        connect(port, SIGNAL(readyRead()), this, SLOT(handle_data()), Qt::QueuedConnection); //Qt::DirectConnection

    }

     

    void SerialPort::handle_data()

    {

        QByteArray data = port->readAll();

        qDebug() << QStringLiteral("data received(收到的数据):") << data;

        qDebug() << "handing thread is:" << QThread::currentThreadId();

        emit receive_data(data);

    }

     

    void SerialPort::write_data()

    {

        qDebug() << "write_id is:" << QThread::currentThreadId();

        port->write("data", 4);   //发送“data”字符

    }

    widget.h的调用代码

    #include "serialport.h"

    public slots:

      void on_receive(QByteArray tmpdata);

    private:

      SerialPort *local_serial;

    widget.cpp调用代码

    //构造函数中

    local_serial = new QSerialPort();

    connect(ui->pushButton, SIGNAL(clicked()), local_serial, SLOT(write_data()));

    connect(local_serial, SIGNAL(receive_data(QByteArray)), this, SLOT(on_receive(QByteArray)), Qt::QueuedConnection);

    //on_receive槽函数

    void Widget::on_receive(QByteArray tmpdata)

    {

     ui->textEdit->append(tmpdata);

    }

    本文例子实现的串口号是 /dev/ttyS1(对应windows系统是COM1口),波特率38400,数据位8,停止位1,无校验位的串口通信。当然,使用串口程序前,需要在.pro文件中添加 QT += serialport,把串口模块加入程序。

    展开全文
  • Qt练习:多线程串口通信

    千次阅读 2020-04-06 22:14:42
    最近在学习Qt编程,为了练手,想做一个串口通信的小软件为之后的项目做准备,经过几天的学习与练习初步搭建起了多线程串口通信的框架及较少的其他功能 功能简介 串口接收 主线程显示ui,子线程接收串口数据,数据...

    最近在学习Qt编程,为了练手,想做一个串口通信的小软件为之后的项目做准备,经过几天的学习与练习初步搭建起了多线程串口通信的框架及较少的其他功能

    功能简介

    1. 串口接收
    2. 主线程显示ui,子线程接收串口数据,数据通过信号和槽发送到主线程
    3. 打开串口启动子线程,关闭串口后关闭子线程
    4. 采用定时器延时方法读取缓存区的数据
    5. 自行选择串口号与波特率,默认数据位为8、停止位为1、无奇偶校验
    6. 16进制显示项目中暂未用到,程序附在最后留存

    界面设计

    由于以后要进行其他数据的解析,用于测试的界面很简单,只设计了很少的控件,UI界面设计如下:
    在这里插入图片描述
    在这里插入图片描述

    子线程

    最开始练习时设计过单线程的串口助手,但是当数据量太大时软件会卡死,因此这次采用了多线程设计。
    首先创建子线程类serialThread,并创建QSerialPort对象及相关初始化方法,主要代码如下:

    serialthread.h

    #ifndef SERIALTHREAD_H
    #define SERIALTHREAD_H
    
    #include<QThread>
    #include<QDebug>
    #include<QSerialPort>
    #include<QSerialPortInfo>
    #include<QString>
    #include<QTimer>
    
    
    class serialThread : public QThread
    {
        Q_OBJECT
    public:
        serialThread();
    
    public:
        QSerialPort *Serial;
        void InitPortName(const QString &portName);                 //初始化串口名
        void InitPortBaudRate(qint32 baudRate);                     //...波特率
        void InitPortDataBits(QSerialPort::DataBits dataBits);      //...数据位
        void InitPortParity(QSerialPort::Parity parity);            //...奇偶校验
        void InitPortStopBits(QSerialPort::StopBits stopbits);      //...停止位
        void InitFlowControl(QSerialPort::FlowControl flowcontrol); //...控制流
        bool OpenPort();                                            //打开串口
        void ClosePort();                                           //关闭串口
    public:
        QByteArray buffer;
    
    signals:
        void dataSend(QByteArray);                                  //发送从串口读取到的数据的信号
        void timeout();
    
    private slots:
        void timeUpdate();
        void data_receive();
        void run();
    
    private:
        QTimer *time;
    };
    
    
    
    #endif // SERIALTHREAD_H
    
    

    然后声明子线程相关方法,连接信号和槽,主要代码如下:
    serialthread.cpp

    #include "serialthread.h"
    
    serialThread::serialThread()
    {
        Serial=new QSerialPort();
        time=new QTimer;
    }
    
    /**
     * @brief 数据接收处理步骤
     * 1.打开串口,开启子线程
     * 2.串口收到数据后启动定时器,延时10ms,防止数据未发送完
     * 3.延时结束后读缓存区的数据
     * 4.将读取到的数据通过信号发送至主线程
     */
    
    void serialThread::run()
    {
        QObject::connect(Serial,&QSerialPort::readyRead,this,&serialThread::data_receive);  //收到数据触发槽函数启动定时器
        QObject::connect(time,SIGNAL(timeout()),this,SLOT(timeUpdate()));                   //延时结束开始读数据
    }
    
    void serialThread::data_receive()
    {
        time->start(10);
    }
    
    void serialThread::timeUpdate()
    {
        time->stop();
        buffer = Serial->readAll();              //读数据
        emit dataSend(buffer);                   //数据发送至主函数
    
    #if 0  
        //以下代码为测试其他功能用的
        for (int i=0;i<(buffer.size()-10);i++)
        {
    
            if(buffer.at(i)==0x55)
            {
                switch (buffer.at(i+1))
                {
                case 0x51:{}break;
                case 0x52:{}break;
                case 0x53:{}break;
                case 0x54:{}break;
                case 0x56:{}break;
                case 0x57:{}break;
                case 0x58:{}break;
                case 0x59:{}break;
                case 0x5A:{}break;
                default:{}break;
                }
            }
        }
    #endif
        buffer.clear();
    }
    
    void serialThread::InitPortName(const QString &portName)
    {
        Serial->setPortName(portName);                          //设置串口名的方法,下同
    }
    
    void serialThread::InitPortBaudRate(qint32 baudRate)
    {
         Serial->setBaudRate(baudRate);
    }
    
    void serialThread::InitPortDataBits(QSerialPort::DataBits dataBits)
    {
        Serial->setDataBits(dataBits);
    }
    
    void serialThread::InitPortStopBits(QSerialPort::StopBits stopbits)
    {
        Serial->setStopBits(stopbits);
    }
    
    void serialThread::InitPortParity(QSerialPort::Parity parity)
    {
        Serial->setParity(parity);
    }
    
    void serialThread::InitFlowControl(QSerialPort::FlowControl flowcontrol)
    {
        Serial->setFlowControl(flowcontrol);
    }
    
    bool serialThread::OpenPort()
    {
        if(Serial->open(QIODevice::ReadWrite))
            return true;
        else
            return false;
    }
    
    void serialThread::ClosePort()
    {
        Serial->close();
    }
    

    主线程

    主线程主要用于UI界面的显示以及启动子线程,其中按钮的槽方法时通过UI编辑器生成的,代码如下:
    mainwindow.h

    #include "serialthread.h"
    
    serialThread::serialThread()
    {
        Serial=new QSerialPort();
        time=new QTimer;
    }
    
    /**
     * @brief 数据接收处理步骤
     * 1.打开串口,开启子线程
     * 2.串口收到数据后启动定时器,延时10ms,防止数据未发送完
     * 3.延时结束后读缓存区的数据
     * 4.将读取到的数据通过信号发送至主线程
     */
    
    void serialThread::run()
    {
        QObject::connect(Serial,&QSerialPort::readyRead,this,&serialThread::data_receive);  //收到数据触发槽函数启动定时器
        QObject::connect(time,SIGNAL(timeout()),this,SLOT(timeUpdate()));                   //延时结束开始读数据
    }
    
    void serialThread::data_receive()
    {
        time->start(10);
    }
    
    void serialThread::timeUpdate()
    {
        time->stop();
        buffer = Serial->readAll();              //读数据
        emit dataSend(buffer);                   //数据发送至主函数
    
    #if 0  
        //以下代码为测试其他功能用的
        for (int i=0;i<(buffer.size()-10);i++)
        {
    
            if(buffer.at(i)==0x55)
            {
                switch (buffer.at(i+1))
                {
                case 0x51:{}break;
                case 0x52:{}break;
                case 0x53:{}break;
                case 0x54:{}break;
                case 0x56:{}break;
                case 0x57:{}break;
                case 0x58:{}break;
                case 0x59:{}break;
                case 0x5A:{}break;
                default:{}break;
                }
            }
        }
    #endif
        buffer.clear();
    }
    
    void serialThread::InitPortName(const QString &portName)
    {
        Serial->setPortName(portName);                          //设置串口名的方法,下同
    }
    
    void serialThread::InitPortBaudRate(qint32 baudRate)
    {
         Serial->setBaudRate(baudRate);
    }
    
    void serialThread::InitPortDataBits(QSerialPort::DataBits dataBits)
    {
        Serial->setDataBits(dataBits);
    }
    
    void serialThread::InitPortStopBits(QSerialPort::StopBits stopbits)
    {
        Serial->setStopBits(stopbits);
    }
    
    void serialThread::InitPortParity(QSerialPort::Parity parity)
    {
        Serial->setParity(parity);
    }
    
    void serialThread::InitFlowControl(QSerialPort::FlowControl flowcontrol)
    {
        Serial->setFlowControl(flowcontrol);
    }
    
    bool serialThread::OpenPort()
    {
        if(Serial->open(QIODevice::ReadWrite))
            return true;
        else
            return false;
    }
    
    void serialThread::ClosePort()
    {
        Serial->close();
    }
    

    mainwindow.cpp

    #include "gpsmap.h"
    #include "ui_gpsmap.h"
    
    gpsMap::gpsMap(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::gpsMap)
    {
        ui->setupUi(this);
        portThread = new serialThread();
    
        foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())     //搜索串口并在界面显示
        {
            ui->portBox->addItem(info.portName());
        }
        ui->baudBox->setCurrentIndex(0);                                           //设置波特率初始值
    
        QObject::connect(portThread, SIGNAL(dataSend(QByteArray)),this,SLOT(dataShow(QByteArray)));  //连接子线程发送数据与主线程接收数据的信号和槽
    }
    
    gpsMap::~gpsMap()
    {
        delete ui;
    }
    
    void gpsMap::dataShow(QByteArray buf)    //数据显示
    {
        QByteArray buffer = buf;
        QString recv=QString(buffer);
    
        ui->textEdit->insertPlainText(recv);
    }
    
    void gpsMap::on_searchBtn_clicked()    //搜索按钮的槽方法
    {
        ui->portBox->clear();
        foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            ui->portBox->addItem(info.portName());
        }
    }
    
    void gpsMap::on_openBtn_clicked()
    {
        if(ui->openBtn->text()==QString("打开"))
        {
            //串口相关参数设置
            portThread->InitPortName(ui->portBox->currentText());
            portThread->InitPortBaudRate(ui->baudBox->currentText().toInt());
            portThread->InitPortDataBits(QSerialPort::Data8);
            portThread->InitPortStopBits(QSerialPort::OneStop);
            portThread->InitPortParity(QSerialPort::NoParity);
            portThread->InitFlowControl(QSerialPort::NoFlowControl);
            
            //若打开失败则提示
            if(!portThread->OpenPort())
            {
                QMessageBox::about(NULL,"提示","无法打开串口!");
                return;
            }
            
            //串口打开后使相关控件失能
            ui->portBox->setEnabled(false);
            ui->baudBox->setEnabled(false);
            ui->searchBtn->setEnabled(false);
            ui->openBtn->setText(QString("关闭"));
            
            //启动子线程
            portThread->start();
        }
        else {
            portThread->quit();
            portThread->ClosePort();
            ui->portBox->setEnabled(true);
            ui->baudBox->setEnabled(true);
            ui->searchBtn->setEnabled(true);
    
            ui->openBtn->setText(QString("打开"));
        }
    }
    
    

    总结

    软件虽实现了串口接收功能,但是当数据量很大时会发生丢帧现象,搜索相关资料后采用定时器延时方法,虽有所改善但仍未解决,接收缓存区只能够存放99字节数据,不知道是自己检测的原因还是其他原因,留待以后解决。

    由于这是第一次独立编写Qt小软件,走了很多弯路,在此感谢CSDN博主分享的方法及代码,如有错误,望指正。

    附:十六进制显示程序(添加到显示程序)

    	QString recv=QString(buffer);
        if(ui->hexBox->isChecked())//添加QCheckBox控件,判断其状态
        {
            QString strDis;
            QString hexRecv=recv.toUtf8().toHex().toUpper();
            for (int i =0;i<hexRecv.length();i+=2) {
                QString st=hexRecv.mid(i,2);
                strDis+=st;
                strDis+=" ";
            }
            ui->receiveEdit->append(strDis);
        }
    
    展开全文
  • QT C++ 多线程支持多串口通信,实现了串口的基本功能,和多线程框架,C++编写,全部工程文件已压缩
  • Qt下实现多线程串口通信

    万次阅读 多人点赞 2018-12-07 09:22:57
    Qt下无论是RS232、RS422、RS485的串口通信都可以使用统一的编码实现。本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现。 代码之路 用SerialPort类实现串口功能,Widget类调用串口。 serialport.h...

    简述

    Qt下无论是RS232、RS422、RS485的串口通信都可以使用统一的编码实现。本文把每路串口的通信各放在一个线程中,使用movetoThread的方式实现。

    代码之路

    用SerialPort类实现串口功能,Widget类调用串口。
    serialport.h如下

    #include <QObject>
    #include <QSerialPort>
    #include <QString>
    #include <QByteArray>
    #include <QObject>
    #include <QDebug>
    #include <QObject>
    #include <QThread>
    
    class SerialPort : public QObject
    {
      Q_OBJECT
    public:
      explicit SerialPort(QObject *parent = NULL);
      ~SerialPort();
    
      void init_port();  //初始化串口
     
    public slots:
      void handle_data();  //处理接收到的数据
      void write_data();     //发送数据
    
    signals:
      //接收数据
      void receive_data(QByteArray tmp);
    
    private:
      QThread *my_thread;
      QSerialPort *port;
    };
    

    serailport.cpp如下

    #include "serialport.h"
    
    SerialPort::SerialPort(QObject *parent) : QObject(parent)
    {
        my_thread = new QThread();
    
        port = new QSerialPort();
        init_port();
        this->moveToThread(my_thread);
        port->moveToThread(my_thread);
        my_thread->start();  //启动线程
    
    }
    
    SerialPort::~SerialPort()
    {
        port->close();
        port->deleteLater();
        my_thread->quit();
        my_thread->wait();
        my_thread->deleteLater();
    }
    
    void SerialPort::init_port()
    {
        port->setPortName("/dev/ttyS1");                   //串口名 windows下写作COM1
        port->setBaudRate(38400);                           //波特率
        port->setDataBits(QSerialPort::Data8);             //数据位
        port->setStopBits(QSerialPort::OneStop);           //停止位
        port->setParity(QSerialPort::NoParity);            //奇偶校验
        port->setFlowControl(QSerialPort::NoFlowControl);  //流控制
        if (port->open(QIODevice::ReadWrite))
        {
            qDebug() << "Port have been opened";
        }
        else
        {
            qDebug() << "open it failed";
        }
        connect(port, SIGNAL(readyRead()), this, SLOT(handle_data()), Qt::QueuedConnection); //Qt::DirectConnection
    }
    
    void SerialPort::handle_data()
    {
        QByteArray data = port->readAll();
        qDebug() << QStringLiteral("data received(收到的数据):") << data;
        qDebug() << "handing thread is:" << QThread::currentThreadId();
        emit receive_data(data);
    }
    
    void SerialPort::write_data()
    {
        qDebug() << "write_id is:" << QThread::currentThreadId();
        port->write("data", 4);   //发送“data”字符
    }
    

    widget.h的调用代码

    #include "serialport.h"
    public slots:
      void on_receive(QByteArray tmpdata);
    private:
      SerialPort *local_serial;
    

    widget.cpp调用代码

    //构造函数中
    local_serial = new SerialPort();
    connect(ui->pushButton, SIGNAL(clicked()), local_serial, SLOT(write_data()),Qt::QueuedConnection);
    connect(local_serial, SIGNAL(receive_data(QByteArray)), this, SLOT(on_receive(QByteArray)), Qt::QueuedConnection);
    //on_receive槽函数
    void Widget::on_receive(QByteArray tmpdata)
    {
     ui->textEdit->append(tmpdata);
    }
    

    写在最后

    本文例子实现的串口号是 /dev/ttyS1(对应windows系统是COM1口),波特率38400,数据位8,停止位1,无校验位的串口通信。当然,使用串口程序前,需要在.pro文件中添加 QT += serialport,把串口模块加入程序。

    展开全文
  • Qt串口多线程收发

    2021-06-19 18:57:30
    //设置串口名 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { qDebug() (); #ifdef Q_OS_WIN32 QString portName = QString("COM%1").arg(COM::getPort()); #else QString portName =...
  • QT串口多线程使用

    千次阅读 2019-05-22 09:41:28
    信号槽,start信号触发串口类的init槽,用来操作串口。 使用信号槽,信号在一个线程,槽在另一个线程执行。 也就是说start在主线程执行,init在串口类行程执行。 (使用信号槽的lambda表达式,都在信号所做线程...
  • Qt多线程串口通信源码

    热门讨论 2010-08-14 00:18:47
    采用Qt4.6.2编写的linux系统下的开源串口通信程序。使用开源的posix_qextserialport类
  • Qt串口通信开发之QSerialPort模块详细使用方法与实例发布时间:2020-10-23 12:19:05来源:脚本之家阅读:111作者:沧海一笑-djQt串口通信基础及名词说明串口通信(Serial Communications)的概念非常简单,串口按位...
  • Qt中利用多线程读取串口数据

    千次阅读 2020-04-30 17:52:25
    需求:有串口进行数据的处理,最好需要把线程封装到串口类(serialPort)中 这样就可以在主线程中通过new个serialport对象myPort1、myPort2等来创建线程管理各个串口 实现方式:继承QObject的方式来写...
  • 详细使用请参考我的另一篇文章: https://tangxing.blog.csdn.net/article/details/111721947 1. 串口在主线程中完成初始化 2.将串口和子类一起放入子线程
  • Qt5多线程串口收发数据

    千次阅读 2020-12-03 16:32:52
    Qt5 多线程串口收发数据 有后需要用串口接收大量数据,但是放在主线程又会使界面卡顿,这个时候就需要使用多线程来接收数据。 多线程的使用教程可以查看我之前写的蹩脚教程:QT 线程 QThread ...
  • QSerialPort类的串口通讯例程,与单片机通信少不了使用串口进行通信,Qt 也提供了串口通信的类,使用的时候在 pro 添加这句导入模块 QT += serialport
  • QT多线程接收串口数据 ** 1.前言 QT多线程的使用,和绝大数人一样,犯了错误(请查阅Qt开发人员( Bradley T. Hughes)Blog中的文章 you are-doing-it-wrong介绍)。为了解决问题,网上查阅学习了几十篇文章,基本都是...
  • 【转】Qt 多线程串口通信问题?

    千次阅读 2019-03-19 10:41:19
    现在我的项目关于线程串口通信这里出了很问题。思路现在就是我首先自己封装了QSerialport的open、read、write函数,然后在通信层中开了 一个线程,在这个线程的构造函数中new了我封的serialport,并且就在这里...
  • QT C++ 多线程串口界面设计

    千次阅读 2018-04-05 20:57:47
    忙了两三天了,总算得空记录一下QT串口,文末会有总的工程文件上传,多谢大家捧场。 之前博文写过PyQT,目前我逐渐偏向C++了,但主要代码思想没有变,如下: 第一,在QTdesigner下,建立好UI,如下图(右下角是我...
  • Qt串口放入线程

    2021-03-22 16:32:02
    Qt线程操作主要有两种 : 一种是直接重写run函数,此时只有run函数内的操作处于线程中,其他定义及函数则还在主线程,会出现跨线程问题. 另一种就是将工作任务继承自QObject,然后将对象moveToThread实现工作对象...
  • Qt实现串口通信(利用windows API实现串口枚举,多线程、生产者消费者模型实现数据解析); 自定义事件,向UI界面提供数据交互接口; 自定义队列,支持线程安全。
  • QT串口通信

    千次阅读 2014-04-07 14:18:14
    Qt串口通信专题教程 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序全程图文讲解),但是由于时间等原因,我只实现了Windows下的串口通信,并没有去做Linux下的。自从...
  • //启动线程 } SerialPort::~SerialPort() { port->close(); port->deleteLater(); my_thread->quit(); my_thread->wait(); my_thread->deleteLater(); } void SerialPort::init_port() { ...
  • Qt串口通信+多线程+数据错乱自动恢复+串口断开自动连接

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,557
精华内容 1,022
关键字:

qt串口通信多线程