QT提供了强大的串口通信支持,通过QtSerialPort模块可以实现跨平台的串口通信功能。下面我将从基础到高级全面讲解QT串口编程。
一、QtSerialPort模块概述
QtSerialPort模块是QT5及以后版本中提供的串口通信库,它:
- 支持Windows、Linux、macOS等主流操作系统
- 提供同步和异步I/O操作
- 支持常见的串口参数配置
- 不依赖其他库,纯QT实现
要使用QtSerialPort模块,需要在项目文件中添加:
QT += serialport
二、基本串口操作
1. 查询可用串口
#include <QSerialPortInfo>
// 获取所有可用串口
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
foreach (const QSerialPortInfo &port, ports) {
qDebug() << "Port:" << port.portName();
qDebug() << "Description:" << port.description();
qDebug() << "Manufacturer:" << port.manufacturer();
qDebug() << "System Location:" << port.systemLocation();
}
2. 打开和配置串口
#include <QSerialPort>
QSerialPort serial;
// 设置串口名
serial.setPortName("COM3"); // Windows
// serial.setPortName("/dev/ttyUSB0"); // Linux
// 打开串口
if (!serial.open(QIODevice::ReadWrite)) {
qDebug() << "无法打开串口" << serial.portName() << ":" << serial.errorString();
return;
}
// 设置波特率
serial.setBaudRate(QSerialPort::Baud9600);
// 设置数据位
serial.setDataBits(QSerialPort::Data8);
// 设置校验位
serial.setParity(QSerialPort::NoParity);
// 设置停止位
serial.setStopBits(QSerialPort::OneStop);
// 设置流控制
serial.setFlowControl(QSerialPort::NoFlowControl);
3. 读写数据
写入数据:
QByteArray sendData = "Hello Serial Port!";
qint64 bytesWritten = serial.write(sendData);
if (bytesWritten == -1) {
qDebug() << "写入数据失败:" << serial.errorString();
} else if (bytesWritten != sendData.size()) {
qDebug() << "写入数据不完整";
} else {
qDebug() << "数据写入成功";
}
// 确保数据被发送
if (!serial.waitForBytesWritten(1000)) {
qDebug() << "等待写入超时或出错:" << serial.errorString();
}
读取数据:
// 连接readyRead信号
connect(&serial, &QSerialPort::readyRead, [&]() {
QByteArray data = serial.readAll();
while (serial.waitForReadyRead(10)) {
data += serial.readAll();
}
qDebug() << "接收到数据:" << data;
});
// 或者同步读取
if (serial.waitForReadyRead(1000)) {
QByteArray data = serial.readAll();
while (serial.waitForReadyRead(10)) {
data += serial.readAll();
}

最低0.47元/天 解锁文章
6919

被折叠的 条评论
为什么被折叠?



