QSerialPort的常用接口

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   |--> 错误处理
+-------------------+

通过合理组合这些接口,可以实现从简单串口调试到复杂工业协议解析的全功能应用。实际开发中需注意:

  1. 优先使用异步信号处理数据
  2. 定期检查串口状态
  3. 对关键操作添加超时机制
  4. 根据硬件特性调整缓冲区大小

3.关联链接

关于串口测试的链接-优快云博客

4.关联知识 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值