1. 程式人生 > >Qt 串口類QSerialPort 使用筆記

Qt 串口類QSerialPort 使用筆記

keyword deb ria clip -m tools ror dal csdn

Qt 串口類QSerialPort 使用筆記

雖然現在大多數的家用PC機上已經不提供RS232接口了。但是由於RS232串口操作簡單、通訊可靠,在工業領域中仍然有大量的應用。Qt以前的版本中,沒有提供官方的對RS232串口的支持,編寫串口程序很不方便。現在好了,在 Qt5.1 中提供了QtSerialPort模塊,方便編程人員快速的開發應用串口的應用程序。 本文就簡單的講講QtSerialPort模塊的使用。

當前的QtSerialPort模塊中提供了兩個C++類,分別是QSerialPort QSerialPortInfo

QSerialPort 類提供了操作串口的各種接口。

QSerialPortInfo 是一個輔助類,可以提供計算機中可用串口的各種信息。

使用方法

先介紹 QSerialPortInfo 的使用。下面是一個簡單的例子,用來列舉出電腦上全部的串口設備。

首先,需要在pro文件中增加如下內容:

QT += serialport

Cpp 文件如下:

[cpp] view plain copy
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QSerialPort>
  4. #include <QSerialPortInfo>
  5. int main(int argc, char *argv[])
  6. {
  7. QCoreApplication a(argc, argv);
  8. foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  9. {
  10. qDebug() << "Name : " << info.portName();
  11. qDebug() << "Description : " << info.description();
  12. qDebug() << "Manufacturer: " << info.manufacturer();
  13. qDebug() << "Serial Number: " << info.serialNumber();
  14. qDebug() << "System Location: " << info.systemLocation();
  15. }
  16. return a.exec();
  17. }

在我的電腦上顯示的結果如下:

[plain] view plain copy
  1. Name : "COM1"
  2. Description : "通信端口"
  3. Manufacturer: "(標準端口類型)"
  4. Serial Number: ""
  5. System Location: "\\.\COM1"
  6. Name : "COM5"
  7. Description : "USB Serial Port"
  8. Manufacturer: "FTDI"
  9. Serial Number: "A400G3UXA"
  10. System Location: "\\.\COM5"

通常,我們需要指定程序使用某一個確定的串口,這時不能只使用串口名稱,因為USB串口每次插在不同的USB口上時獲得的串口名稱都可能有變化。這時可以利用串口的序列號,這個號碼一般來說是唯一的,比如下面的代碼,首先遍歷所有的串口,找到我們需要的串口後就返回。

[cpp] view plain copy
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QSerialPort>
  4. #include <QSerialPortInfo>
  5. int main(int argc, char *argv[])
  6. {
  7. QCoreApplication a(argc, argv);
  8. QSerialPortInfo com_info;
  9. foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  10. {
  11. if( info.serialNumber() == "A400G3UXA" )
  12. {
  13. com_info = info;
  14. break;
  15. }
  16. }
  17. qDebug() << "Name : " << com_info.portName();
  18. qDebug() << "Description : " << com_info.description();
  19. qDebug() << "serialNumber: " << com_info.serialNumber();
  20. return a.exec();
  21. }

QSerialPort 負責具體的串口操作。選定串口後,要先打開串口,才能設置波特率等參數。這些參數都設置好了就可以使用了。最基本的操作無非是read() write()。需要註意的是這兩個操作都是非阻塞的。

另外有一個重要的signal 也需要用到,那就是 void QIODevice::readyRead()

每次串口收到數據後都會發出這個signal。我們的程序中需要定義一個slot,並將其與這個signal 相連接。這樣,每次新數據到來後,我們就可以在slot中讀取數據了。這時一定要將串口緩沖區中的數據全部讀出來,可以利用readAll() 來實現。

下面的代碼片段給出了設置串口的例子。

[cpp] view plain copy
  1. m_reader.setPort(info);
  2. if(m_reader.open(QIODevice::ReadWrite))
  3. {
  4. qDebug() << "m_reader.open(QIODevice::ReadWrite)";
  5. m_reader.setBaudRate(QSerialPort::Baud9600);
  6. m_reader.setParity(QSerialPort::NoParity);
  7. m_reader.setDataBits(QSerialPort::Data8);
  8. m_reader.setStopBits(QSerialPort::OneStop);
  9. m_reader.setFlowControl(QSerialPort::NoFlowControl);
  10. m_reader.clearError();
  11. m_reader.clear();
  12. connect(&m_reader, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
  13. }
  14. void Dialog::readyReadSlot()
  15. {
  16. qDebug() << "x";
  17. QByteArray arr = m_reader.readAll();
  18. do_something(arr);
  19. }



Qt 串口類QSerialPort 使用筆記