Qt串口多线程收发

#include "serialport.h"
#include "Configuration.h"
#include "global.h"
#include <QDebug>
#include <QThread>

SerialPort::SerialPort()
{
    isRun = true;
    this->setAutoDelete(true);
}

SerialPort::~SerialPort()
{
    if (serial){
        delete serial;
        serial = nullptr;
    }
    qDebug() << "~SerialPort";
}

void SerialPort::init()
{
    serial = new QSerialPort();
    //设置串口名
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() <<"COM:"<< info.portName();
#ifdef Q_OS_WIN32
        QString portName = QString("COM%1").arg(COM::getPort());
#else
        QString portName = QString("ttyUSB%1").arg(COM::getPort());
#endif
        if (info.portName() == portName) {
            qDebug() <<"COM:find " << portName;
            serial->setPortName(info.portName());
        } else {
            qDebug() <<"COM:not find " << portName;
        }
    }
    //设置波特率
    serial->setBaudRate(COM::getBaudRate());
    //设置数据位数
    serial->setDataBits(QSerialPort::Data8);
    //设置奇偶校验
    serial->setParity(QSerialPort::NoParity);
    //设置停止位
    serial->setStopBits(QSerialPort::OneStop);
    //设置流控制
    serial->setFlowControl(QSerialPort::NoFlowControl);
}

void SerialPort::close()
{
    isRun = false;
}

void SerialPort::sendData(QByteArray data)
{
    sendMData = data;
    qDebug() <<"sendData:"<<sendMData.toHex();
}

void SerialPort::run()
{
    init();
    //读取数据
    while (isRun) {
        if (serial->isOpen()) {
            if(serial->waitForReadyRead(50)){
                QByteArray requestData = serial->readAll();
                GlobalData::addData(requestData);
            }
            if (sendMData != "") {
                serial->write(sendMData);
                if (serial->waitForBytesWritten(50)) {
                    sendMData = "";
                }
            }
        } else {
            QThread::msleep(3000);
            if(!serial->open(QIODevice::ReadWrite))
            {
                qDebug() <<"COM:open fail";
            }
        }
    }
}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt是一种广泛使用的C++跨平台应用程序开发框架,主要用于开发GUI程序。Qt提供了串口通信的相关类和函数,同时也支持多线程开发。Qt串口通信类中,最重要的类是QSerialPort,它提供了一系列与串口通信相关的函数,包括打开串口、设置串口参数、读取数据、写入数据等。而对于多线程开发,在Qt中通常使用QThread类来创建线程。在串口通信多线程开发中,可以使用QThread类创建一个新的线程来处理串口通信,从而提高程序的并发性和稳定性。可以使用Qt的信号和槽机制来实现不同线程之间的通讯和数据传递。同时,在多线程开发中需要注意线程的同步和互斥,以避免多线程访问同一资源造成的冲突和数据损坏。 Qt串口多线程开发的源码实现需要先创建一个串口通信类,然后继承QThread类创建一个新的线程,在该线程中调用串口通信类的函数进行通讯。在实现过程中需要使用信号和槽机制来实现不同线程之间的通讯和数据传递,同时也需要考虑线程的同步和互斥问题,以避免多线程访问同一资源造成的冲突和数据损坏。 总之,Qt提供了非常完善的串口通信多线程开发的支持,并且在实现过程中也比较简单,只需要熟悉Qt的相关类和函数即可。同时,在开发过程中也需要遵循一些基本的原则,如线程安全、代码可读性等,以确保程序的质量和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值