Qt串口/QSerialPort 在线程中使用

使用的关键点是要在 run() 里面创建事件循环,且 QSerialPort 要在 run() 里面初始化

// serial_thread.h

#ifndef SERIALTHREAD_H
#define SERIALTHREAD_H

#include <QObject>
#include <QThread>
#include <QtSerialPort>

#define MDEBUG qDebug() << QThread::currentThreadId() << __FUNCTION__ << __LINE__

class SerialThread : public QThread
{
    Q_OBJECT
public:
    SerialThread();

    void run() override;

    QSerialPort* serial;

};

#endif // SERIALTHREAD_H
// serial_thread.cpp

#include "serial_thread.h"

SerialThread::SerialThread()
{
    MDEBUG;
}

void SerialThread::run()
{   
    //设置串口名
    serial = new QSerialPort();
    serial->setPortName("COM1");
    //设置波特率
    serial->setBaudRate(QSerialPort::Baud9600);
    //设置数据位数
    serial->setDataBits(QSerialPort::Data8);
    //设置奇偶校验
    serial->setParity(QSerialPort::NoParity);
    //设置停止位
    serial->setStopBits(QSerialPort::OneStop);
    //设置流控制
    serial->setFlowControl(QSerialPort::NoFlowControl);
    //打开串口
    serial->open(QIODevice::ReadWrite);
    
    serial->write("ABCDEFGH");
    QEventLoop loop;        // 非常重要, 没有事件循环数据无法发送
    QTimer::singleShot(1, &loop, SLOT(quit()));
    loop.exec();
    
    while (true) {          // 每秒定时发送
        serial->write("AB");
        emit msgEvent();
        QEventLoop loop;    // 非常重要, 没有事件循环数据无法发送
        QTimer::singleShot(1000, &loop, SLOT(quit()));
        loop.exec();
        MDEBUG << QDateTime::currentDateTime().toString("hh:mm:ss");
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值