1.概要
2.内容
QSerialPort
提供了丰富的接口来管理串口通信,以下是其最常用的接口分类及示例:
一、配置类接口
1. 设置串口名称
serial->setPortName("COM3"); // Windows
serial->setPortName("/dev/ttyUSB0"); // Linux/macOS
2. 波特率设置
// 方法1:直接使用枚举值
serial->setBaudRate(QSerialPort::Baud115200);
// 方法2:自定义数值(需确保硬件支持)
serial->setBaudRate(9600);
3. 数据位设置
serial->setDataBits(QSerialPort::Data8); // 5/6/7/8 位可选
4. 停止位设置
serial->setStopBits(QSerialPort::OneStop); // 1 位
serial->setStopBits(QSerialPort::TwoStop); // 2 位
5. 校验位设置
serial->setParity(QSerialPort::NoParity); // 无校验
serial->setParity(QSerialPort::EvenParity); // 偶校验
6. 流控设置
serial->setFlowControl(QSerialPort::NoFlowControl); // 无流控
serial->setFlowControl(QSerialPort::HardwareControl); // 硬件流控
二、控制类接口
1. 打开/关闭串口
// 打开串口(读写模式)
if (!serial->open(QIODevice::ReadWrite)) {
qDebug() << "Error:" << serial->errorString();
}
// 关闭串口
serial->close();
2. 刷新缓冲区
serial->flush(); // 清空输出缓冲区(确保数据发送完成)
3. 清除输入缓冲区
serial->clear(); // 清空输入缓冲区(丢弃未读取数据)
三、数据传输接口
1. 发送数据
// 同步发送(阻塞式)
qint64 bytesWritten = serial->write("Hello\n");
// 异步发送(结合信号槽)
connect(serial, &QSerialPort::bytesWritten, this, [&](qint64 bytes) {
qDebug() << "Sent" << bytes << "bytes";
});
2. 接收数据
// 异步接收(信号驱动)
connect(serial, &QSerialPort::readyRead, this, [&]() {
QByteArray data = serial->readAll();
qDebug() << "Received:" << data;
});
// 同步读取(阻塞式)
QByteArray data = serial->read(1024); // 读取最多1024字节
四、信号与状态接口
1. 常用信号
// 数据到达时触发
connect(serial, &QSerialPort::readyRead, this, &MyClass::handleReadyRead);
// 数据发送完成时触发
connect(serial, &QSerialPort::bytesWritten, this, &MyClass::handleBytesWritten);
// 错误发生时触发
connect(serial, QOverload<QSerialPort::SerialPortError>::of(&QSerialPort::error),
this, &MyClass::handleError);
2. 状态查询
serial->isOpen(); // 串口是否已打开
serial->isReadable(); // 是否可读
serial->isWritable(); // 是否可写
五、错误处理接口
1. 获取错误信息
QSerialPort::SerialPortError error = serial->error();
if (error != QSerialPort::NoError) {
qDebug() << "Serial Error:" << serial->errorString();
}
2. 清除错误状态
serial->clearError(); // 清除错误标志(部分错误需重启串口)
六、高级接口示例
1. 设置读取超时
// 设置读取操作超时时间为500ms
serial->setReadBufferSize(1024); // 缓冲区大小
QTimer timeoutTimer;
connect(&timeoutTimer, &QTimer::timeout, this, [&]() {
qDebug() << "Read Timeout!";
});
timeoutTimer.start(500);
2. 发送带校验的Modbus数据
QByteArray modbusRequest;
modbusRequest.append(0x01); // 设备地址
modbusRequest.append(0x03); // 功能码
modbusRequest.append(0x00); // 起始地址高位
modbusRequest.append(0x00); // 起始地址低位
modbusRequest.append(0x00); // 数据数量高位
modbusRequest.append(0x02); // 数据数量低位
// 计算CRC校验
quint16 crc = QSerialPort::calculateCrc(modbusRequest);
modbusRequest.append(crc & 0xFF);
modbusRequest.append(crc >> 8);
serial->write(modbusRequest);
接口关系图
+-------------------+
| QSerialPort |
+-------------------+
| - setPortName() |
| - setBaudRate() |
| - open() |
| - write() |
| - read() |
| - readyRead |--> 用户槽函数
| - errorOccurred |--> 错误处理
+-------------------+
通过合理组合这些接口,可以实现从简单串口调试到复杂工业协议解析的全功能应用。实际开发中需注意:
- 优先使用异步信号处理数据
- 定期检查串口状态
- 对关键操作添加超时机制
- 根据硬件特性调整缓冲区大小
3.关联链接
4.关联知识