您好,登錄后才能下訂單哦!
這篇文章主要講解了“Qt5串口類QSerialPort怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Qt5串口類QSerialPort怎么實(shí)現(xiàn)”吧!
在Qt5以上提供了QtSerialPort模塊,方便編程人員快速的開發(fā)應(yīng)用串口的應(yīng)用程序。
QtSerialPort模塊中提供了兩個(gè)C++類,分別是QSerialPort 和QSerialPortInfo。
QSerialPort 類是Qt5封裝的串口類,可與串口進(jìn)行通信,提供了操作串口的各種接口。
QSerialPortInfo類是一個(gè)輔助類,可以提供計(jì)算機(jī)中可用串口的各種信息。如可用的串口名稱,描述,制造商,序列號(hào),串口16位產(chǎn)品編號(hào)等。利用QSerialPortInfo提供的可用串口信息,可設(shè)置串口波特率,并打開需要的串口進(jìn)行通信。
使用Qt5進(jìn)行串口通信大致步驟為:配置串口參數(shù)->打開串口->收發(fā)數(shù)據(jù)。
要使用QtSerialPort模塊,需要在工程文件.pro文件或.pri中增加語句:
QT += serialport
Qt版本:5.12.8
列舉出電腦上全部的串口設(shè)備,Cpp 文件如下:
#include <QCoreApplication> #include <QDebug> #include <QSerialPort> #include <QSerialPortInfo> 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(); }
顯示的結(jié)果如下:
Name : "COM17"
Description : "USB-SERIAL CH340"
Manufacturer: "wch.cn"
Serial Number: ""
System Location: "\\\\.\\COM17"
Name : "COM1"
Description : "通信端口"
Manufacturer: "(標(biāo)準(zhǔn)端口類型)"
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口上時(shí)獲得的串口名稱可能有變化,這時(shí)可以利用串口的序列號(hào),指定程序使用某一個(gè)確定的串口。
#include <QCoreApplication> #include <QDebug> #include <QSerialPort> #include <QSerialPortInfo> 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(); }
QSerialPort 類提供了操作串口的各種接口。
頭文件:
class MySerial : public QObject { Q_OBJECT public: 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); //設(shè)置串行端口的名稱 m_SerialPort->setBaudRate(QSerialPort::Baud115200); //波特率:115200 bps m_SerialPort->setDataBits(QSerialPort::Data8); //數(shù)據(jù)位:8 位 m_SerialPort->setStopBits(QSerialPort::OneStop); //停止位:1 位 m_SerialPort->setParity(QSerialPort::NoParity); //校驗(yàn)位:無 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(); //丟棄緩沖區(qū)中的所有字符, 同時(shí)終止掛起的讀取或?qū)懭氩僮? 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(); //盡可能多地從內(nèi)部寫緩沖區(qū)寫入底層串口而不阻塞 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怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Qt5串口類QSerialPort怎么實(shí)現(xiàn)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。