網(wǎng)站首頁 編程語言 正文
簡(jiǎ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
1.QSerialPortInfo類 ??
列舉出電腦上全部的串口設(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();
}
2.QSerialPort類
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();
}
原文鏈接:https://blog.csdn.net/hebbely/article/details/123482278
相關(guān)推薦
- 2022-06-12 C語言實(shí)題講解快速掌握單鏈表上_C 語言
- 2024-03-20 錯(cuò)誤code128:npm ERR! An unknown git error occurred c
- 2022-04-08 WPF引用MVVM框架與使用方法_基礎(chǔ)應(yīng)用
- 2022-10-02 Flutter的鍵值存儲(chǔ)數(shù)據(jù)庫(kù)使用示例詳解_Android
- 2022-09-25 什么是模板引擎(web)?常見的模板引擎有哪些?thymeleaf的常用指令介紹
- 2022-10-08 react-redux的基本使用_React
- 2022-09-25 Linux基礎(chǔ)組件之基于循環(huán)數(shù)組的無鎖隊(duì)列
- 2022-05-17 ubuntu Could NOT find CURL (missing: CURL_LIBRARY
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支