串口编程
在工控行业中,开发者常常需要编写上位机程序来与下位机设备进行通信。
串口是一种常见的通信接口,被广泛应用于工业控制、数据采集等领域。
Qt Serial Port
Qt作为一个强大的跨平台应用程序开发框架,其Serial Port模块为开发者提供了方便快捷的串口通信功能。
- 使用Qt Serial Port模块,开发者可以轻松地配置串口通信参数,如波特率、数据位、停止位和奇偶校验等。
- 这些参数的配置对于确保串口通信的稳定性和可靠性至关重要。一旦串口通信参数配置完成,开发者就可以使用Qt Serial Port模块提供的数据读写函数来进行串口数据的收发。
Qt Serial Port模块提供了丰富的API接口,使得开发者可以以阻塞式或非阻塞式的方式来进行数据读写。
在GUI程序中,通常使用非阻塞式方式进行数据读写,以避免阻塞主线程。而在非GUI程序或单独的线程中,开发者则可以使用阻塞式方式进行数据读写。
通过使用Qt Serial Port模块,开发者可以方便地编写出具有串口通信功能的上位机程序。
Qt Serial Port模块
Qt Serial Port模块用于串口通信编程,要在一个项目中使用Qt Serial Port模块,需要在项目配置文件中加入如下一行语句:
plain
QT+=serialport
串口的通信协议比较简单,Qt Serial Port模块中只有两个类:QSerialPortInfo和 QSerialPort。
QSerialPortInfo
QSerialPortInfo 是 Qt 中用于提供串行端口信息的类,它可以帮助开发者获取关于可用串口的信息,比如串口名称、描述、制造商等。下面是对 QSerialPortInfo 的详细介绍及示例。
QSerialPortInfo 类提供以下功能:
- 列出系统中可用的串行端口。
- 获取特定串口的详细信息。
- 检查串口的状态(如是否可用、是否已打开等)。
常用方法
- availablePorts():静态方法,返回当前所有可用的串口信息列表。
- portName():返回串口的名称。
- description():返回用户对串口的描述。
- manufacturer():返回串口的制造商。
- isNull():检查对象是否是有效的串口信息。
示例:使用 QSerialPortInfo 列出所有可用串口信息的示例。
cpp
#include <QCoreApplication>
#include <QSerialPortInfo>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
if (ports.isEmpty()) {
qDebug() << "No available ports.";
} else {
qDebug() << "Available Serial Ports:";
for (const QSerialPortInfo &portInfo : ports) {
qDebug() << "Port Name:" << portInfo.portName();
qDebug() << "Description:" << portInfo.description();
qDebug() << "Manufacturer:" << portInfo.manufacturer();
qDebug() << "Serial Number:" << portInfo.serialNumber();
qDebug() << "System Location:" << portInfo.systemLocation();
qDebug() << "Vendor Identifier:" << portInfo.vendorIdentifier();
qDebug() << "Product Identifier:" << portInfo.productIdentifier();
qDebug() << "------------------------------------------------";
}
}
return a.exec();
}
说明
- 项目设置:在 .pro 文件中包含 core 模块:
plain
QT += core
- 运行程序:此程序将输出当前系统中的所有可用串口的详细信息,包括端口名称、描述和制造商信息。
QSerialPort
设置串口通信参数 :
QSerialPort提供了设置串口通信参数的功能,包括波特率、数据位个数、停止位个数和奇偶校验位等。这些参数可以通过QSerialPort的相应函数进行设置和获取。
打开和关闭串口 :
在设置完串口通信参数后,需要指定串口的名称,然后才能打开串口进行数据读写。打开串口后,当不再需要进行串口通信时,应调用close()函数来关闭串口。
数据读写 :
QSerialPort提供了多种数据读写方式,包括阻塞式和非阻塞式(异步方式)。在GUI程序中,一般使用非阻塞式方式进行数据读写,以避免阻塞主线程。与异步方式相关的函数可用于读取和写入串口数据。
QSerialPort 类提供以下功能:
- 打开和配置串行端口。
- 发送和接收数据。
- 支持异步和同步操作。
- 支持多种串口配置,如波特率、数据位、停止位、奇偶校验等。
常用方法
- open(QIODevice::OpenMode):打开串口。
- close():关闭串口。
- setBaudRate():设置波特率。
- setDataBits():设置数据位数。
- setParity():设置奇偶校验。
- setStopBits():设置停止位。
- write():发送数据。
- read():接收数据。
示例:示例程序打开串口,并向设备发送数据。
cpp
#include <QCoreApplication>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QString portName = "COM3"; // 根据实际情况设置端口名
QSerialPort serialPort;
serialPort.setPortName(portName);
// 设置串口参数
if (!serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "Failed to open port" << portName << ":" << serialPort.errorString();
return 1;
}
serialPort.setBaudRate(QSerialPort::Baud9600);
serialPort.setDataBits(QSerialPort::Data8);
serialPort.setParity(QSerialPort::NoParity);
serialPort.setStopBits(QSerialPort::OneStop);
serialPort.setFlowControl(QSerialPort::NoFlowControl);
// 发送数据
QByteArray dataToSend = "Hello World";
serialPort.write(dataToSend);
if (!serialPort.waitForBytesWritten(1000)) {
qDebug() << "Failed to write data:" << serialPort.errorString();
}
// 读取数据
if (serialPort.waitForReadyRead(1000)) {
QByteArray receivedData = serialPort.readAll();
while (serialPort.waitForReadyRead(10)) {
receivedData += serialPort.readAll();
}
qDebug() << "Received data:" << receivedData;
} else {
qDebug() << "No data received:" << serialPort.errorString();
}
serialPort.close(); // 关闭串口
return a.exec();
}
说明
- 项目设置:确保在 .pro 文件中包含 serialport 模块:
plain
QT += serialport
- 运行程序:根据实际情况设置串口名称(例如:COM1,/dev/ttyUSB0等),然后运行程序。