千家信息网

Qt5串口类QSerialPort怎么实现

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要讲解了"Qt5串口类QSerialPort怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Qt5串口类QSerialPort怎么实现
千家信息网最后更新 2025年01月16日Qt5串口类QSerialPort怎么实现

这篇文章主要讲解了"Qt5串口类QSerialPort怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Qt5串口类QSerialPort怎么实现"吧!

简述

在Qt5以上提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。

QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。

QSerialPort 类是Qt5封装的串口类,可与串口进行通信,提供了操作串口的各种接口。

QSerialPortInfo类是一个辅助类,可以提供计算机中可用串口的各种信息。如可用的串口名称,描述,制造商,序列号,串口16位产品编号等。利用QSerialPortInfo提供的可用串口信息,可设置串口波特率,并打开需要的串口进行通信。

使用Qt5进行串口通信大致步骤为:配置串口参数->打开串口->收发数据。

要使用QtSerialPort模块,需要在工程文件.pro文件或.pri中增加语句:

QT += serialport

Qt版本:5.12.8

1.QSerialPortInfo类

列举出电脑上全部的串口设备,Cpp 文件如下:

#include #include  #include #include  int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())    {        qDebug() << "Name : " << info.portName();        qDebug() << "Description : " << info.description();        qDebug() << "Manufacturer: " << info.manufacturer();        qDebug() << "Serial Number: " << info.serialNumber();        qDebug() << "System Location: " << info.systemLocation();    }    return a.exec();}

显示的结果如下:

Name : "COM17"
Description : "USB-SERIAL CH340"
Manufacturer: "wch.cn"
Serial Number: ""
System Location: "\\\\.\\COM17"
Name : "COM1"
Description : "通信端口"
Manufacturer: "(标准端口类型)"
Serial Number: ""
System Location: "\\\\.\\COM1"
Name : "COM16"
Description : "Prolific USB-to-Serial Comm Port"
Manufacturer: "Prolific"
Serial Number: "A400G3UXA"
System Location: "\\\\.\\COM16"
Name : "COM11"
Description : "Prolific USB-to-Serial Comm Port"
Manufacturer: "Prolific"
Serial Number: ""
System Location: "\\\\.\\COM11"

若USB串口每次插在不同的USB口上时获得的串口名称可能有变化,这时可以利用串口的序列号,指定程序使用某一个确定的串口。

#include #include #include #include  int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    QSerialPortInfo com_info;    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())    {        if( info.serialNumber() == "A400G3UXA" )        {            com_info = info;            break;        }    }    qDebug() << "Name : " << com_info.portName();    qDebug() << "Description : " << com_info.description();    qDebug() << "serialNumber: " << com_info.serialNumber();    return a.exec();}

2.QSerialPort类

QSerialPort 类提供了操作串口的各种接口。

头文件:

class MySerial : public QObject{    Q_OBJECTpublic:    MySerial(QString portName = "ttyUSB1", QObject *parent = nullptr);    ~MySerial();    bool WriteToSerial(QByteArray cmd);    QByteArray ReadFromSerial();    bool SerialIsOpen() { return m_SerialPort->isOpen(); }    void closeSerial();signals:    void sig_SendTipInfo(bool result, QString info);    void sig_SendReadData(QByteArray data); private:    QSerialPort *m_SerialPort = nullptr;};

cpp文件:

MySerial::MySerial(QString portName, QObject *parent) :    QObject(parent){    m_SerialPort = new QSerialPort();    m_SerialPort->setPortName(portName);                //设置串行端口的名称    m_SerialPort->setBaudRate(QSerialPort::Baud115200); //波特率:115200 bps    m_SerialPort->setDataBits(QSerialPort::Data8);      //数据位:8 位    m_SerialPort->setStopBits(QSerialPort::OneStop);    //停止位:1 位    m_SerialPort->setParity(QSerialPort::NoParity);     //校验位:无    m_SerialPort->setFlowControl(QSerialPort::NoFlowControl);    qDebug() << "Port Name:" << portName;    if(!m_SerialPort->open(QIODevice::ReadWrite))    {        emit sig_SendTipInfo(false, "opened failed");        qDebug() << "open failed";    }    else qDebug() << "open successfully";} MySerial::~MySerial(){    m_SerialPort->clear();    //丢弃缓冲区中的所有字符, 同时终止挂起的读取或写入操作    m_SerialPort->close();    m_SerialPort->deleteLater();} bool MySerial::WriteToSerial(QByteArray cmd){    if(cmd.isEmpty()) return false;//    qDebug() << "[ == MySerial == ] Send Data:" << cmd.toHex();    this->m_SerialPort->clear();    this->m_SerialPort->write(cmd);    this->m_SerialPort->flush();    //尽可能多地从内部写缓冲区写入底层串口而不阻塞    this->m_SerialPort->waitForBytesWritten(10);    return true;} QByteArray MySerial::ReadFromSerial(){    QByteArray readData;    this->m_SerialPort->waitForReadyRead(5);    readData.append(this->m_SerialPort->readAll());    while (this->m_SerialPort->waitForReadyRead(5)) readData.append(this->m_SerialPort->readAll());    if(readData.isEmpty()) return QByteArray();//    qDebug() << "[ == MySerial == ] Read Data:" << readData.toHex();    return readData;} void MySerial::closeSerial(){    if(!m_SerialPort->isOpen()) return;    m_SerialPort->clear();    m_SerialPort->close();}

感谢各位的阅读,以上就是"Qt5串口类QSerialPort怎么实现"的内容了,经过本文的学习后,相信大家对Qt5串口类QSerialPort怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0