生活随笔
收集整理的這篇文章主要介紹了
Qt 串口类QSerialPort 使用笔记
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Qt?串口類 QSerialPort?使用筆記
?
雖然現(xiàn)在大多數(shù)的家用PC 機(jī)上已經(jīng)不提供 RS232 接口了。但是由于 RS232 串口操作簡(jiǎn)單、通訊可靠,在工業(yè)領(lǐng)域中仍然有大量的應(yīng)用。 Qt 以前的版本中,沒有提供官方的對(duì) RS232 串口的支持,編寫串口程序很不方便。現(xiàn)在好了,在? Qt5.1? 中提供了 QtSerialPort 模塊,方便編程人員快速的開發(fā)應(yīng)用串口的應(yīng)用程序。?本文就簡(jiǎn)單的講講 QtSerialPort 模塊的使用。
?
當(dāng)前的QtSerialPort 模塊中提供了兩個(gè) C++ 類,分別是 QSerialPort? 和 QSerialPortInfo 。
QSerialPort?類提供了操作串口的各種接口。
QSerialPortInfo?是一個(gè)輔助類,可以提供計(jì)算機(jī)中可用串口的各種信息。
使用方法
先介紹?QSerialPortInfo? 的使用。下面是一個(gè)簡(jiǎn)單的例子,用來列舉出電腦上全部的串口設(shè)備。
首先,需要在pro 文件中增加如下內(nèi)容:
QT?+=?serialport
?
Cpp?文件如下:
[cpp]?view plaincopy
#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é)果如下:
[plain]?view plaincopy
Name?:??"COM1"?? Description?:??"通信端口"?? Manufacturer:??"(標(biāo)準(zhǔn)端口類型)"?? Serial?Number:??""?? System?Location:??"\\.\COM1"?? Name?:??"COM5"?? Description?:??"USB?Serial?Port"?? Manufacturer:??"FTDI"?? Serial?Number:??"A400G3UXA"?? System?Location:??"\\.\COM5"??
通常,我們需要指定程序使用某一個(gè)確定的串口,這時(shí)不能只使用串口名稱,因?yàn)?span style="font-family:'Times New Roman';">USB串口每次插在不同的 USB 口上時(shí)獲得的串口名稱都可能有變化。這時(shí)可以利用串口的序列號(hào),這個(gè)號(hào)碼一般來說是唯一的,比如下面的代碼,首先遍歷所有的串口,找到我們需要的串口后就返回。
[cpp]?view plaincopy
#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?負(fù)責(zé)具體的串口操作。選定串口后,要先打開串口,才能設(shè)置波特率等參數(shù)。這些參數(shù)都設(shè)置好了就可以使用了。最基本的操作無非是 read()? 和? write() 。需要注意的是這兩個(gè)操作都是非阻塞的。
另外有一個(gè)重要的signal? 也需要用到,那就是? void?QIODevice::readyRead()
每次串口收到數(shù)據(jù)后都會(huì)發(fā)出這個(gè)signal 。我們的程序中需要定義一個(gè) slot ,并將其與這個(gè) signal? 相連接。這樣,每次新數(shù)據(jù)到來后,我們就可以在 slot 中讀取數(shù)據(jù)了。這時(shí)一定要將串口緩沖區(qū)中的數(shù)據(jù)全部讀出來,可以利用 readAll()? 來實(shí)現(xiàn)。
下面的代碼片段給出了設(shè)置串口的例子。
[cpp]?view plaincopy
????m_reader.setPort(info);?? ????if (m_reader.open(QIODevice::ReadWrite))?? ????{?? ????????qDebug()?<<?"m_reader.open(QIODevice::ReadWrite)" ;?? ????????m_reader.setBaudRate(QSerialPort::Baud9600);?? ????????m_reader.setParity(QSerialPort::NoParity);?? ????????m_reader.setDataBits(QSerialPort::Data8);?? ????????m_reader.setStopBits(QSerialPort::OneStop);?? ????????m_reader.setFlowControl(QSerialPort::NoFlowControl);?? ?? ????????m_reader.clearError();?? ????????m_reader.clear();?? ????????connect(&m_reader,?SIGNAL(readyRead()),?this ,?SLOT(readyReadSlot()));?? }?? ?? ?? void ?Dialog::readyReadSlot()?? {?? ????qDebug()?<<?"x" ;?? ????QByteArray?arr?=?m_reader.readAll();?? ????do_something(arr);?? } ?
總結(jié)
以上是生活随笔 為你收集整理的Qt 串口类QSerialPort 使用笔记 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。