1.概要
2.内容
QSerialPort
是 Qt 框架中用于串口通信的核心类,提供跨平台的串口设备访问接口。以下是其关键特性和使用指南:
核心功能
-
跨平台支持
统一处理 Windows(COM1
)、Linux(/dev/ttyUSB0
)、macOS 的串口设备 -
参数配置
支持设置:- 波特率(
setBaudRate()
) - 数据位(
setDataBits()
:5/6/7/8) - 停止位(
setStopBits()
:1/1.5/2) - 校验位(
setParity()
:None/Odd/Even) - 流控(
setFlowControl()
:Hardware/Software)
- 波特率(
-
数据读写
- 阻塞式读写:
read()
/write()
- 异步信号:
readyRead
(数据到达)、bytesWritten
(数据发送完成)
- 阻塞式读写:
典型使用流程
// 1. 创建并配置串口对象
QSerialPort *serial = new QSerialPort(this);
serial->setPortName("/dev/ttyUSB0"); // Linux 设备示例
serial->setBaudRate(QSerialPort::Baud115200);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
// 2. 打开串口(读写模式)
if (!serial->open(QIODevice::ReadWrite)) {
qDebug() << "打开失败:" << serial->errorString();
return;
}
// 3. 连接信号槽(异步处理)
connect(serial, &QSerialPort::readyRead, this, [&]() {
QByteArray data = serial->readAll();
qDebug() << "收到数据:" << data;
});
// 4. 发送数据
QByteArray txData = "Hello Serial";
serial->write(txData);
常见问题排查
- 端口无法打开
- 检查设备权限(Linux):
ls -l /dev/ttyUSB0 # 确认所属组是否为 dialout sudo usermod -aG dialout $USER # 添加用户到 dialout 组
- 确认设备未被其他程序占用
- 检查设备权限(Linux):
- 无数据接收
- 检查接线(TX/RX 交叉连接)
- 确认波特率、校验位等参数一致
- 使用
serial->flush()
确保缓冲区清空
- 数据错误或乱码
- 确认数据位、停止位、校验位匹配
- 检查流控设置(硬件流控需连接 RTS/CTS 引脚)
高级用法示例
1. 非阻塞发送(确保数据全部发出)
void sendData(const QByteArray &data) {
qint64 bytesWritten = serial->write(data);
if (bytesWritten == -1) {
qDebug() << "发送失败:" << serial->errorString();
return;
}
// 等待数据全部发送完成
if (!serial->waitForBytesWritten(1000)) {
qDebug() << "发送超时";
}
}
2. 读取指定长度数据
QByteArray readExact(int size) {
QByteArray buffer;
while (buffer.size() < size) {
if (serial->waitForReadyRead(1000)) {
buffer.append(serial->readAll());
} else {
qDebug() << "读取超时";
break;
}
}
return buffer;
}
3. 错误处理
void handleError(QSerialPort::SerialPortError error) {
if (error == QSerialPort::ResourceError) {
qDebug() << "严重错误:" << serial->errorString();
serial->close();
}
}
调试工具
-
终端命令验证串口
# 发送数据 echo "test" > /dev/ttyUSB0 # 监听数据(需权限) sudo cat /dev/ttyUSB0
-
Qt 调试宏
// 打印所有可用串口 qDebug() << "可用串口: " << QSerialPortInfo::availablePorts();
通过合理配置 QSerialPort
并结合信号槽机制,可实现高效可靠的串口通信。
3.关联链接
4.关联知识