QSerialPort

1.概要

2.内容

QSerialPort 是 Qt 框架中用于串口通信的核心类,提供跨平台的串口设备访问接口。以下是其关键特性和使用指南:


核心功能

  1. 跨平台支持
    统一处理 Windows(COM1)、Linux(/dev/ttyUSB0)、macOS 的串口设备

  2. 参数配置
    支持设置:

    • 波特率(setBaudRate()
    • 数据位(setDataBits():5/6/7/8)
    • 停止位(setStopBits():1/1.5/2)
    • 校验位(setParity():None/Odd/Even)
    • 流控(setFlowControl():Hardware/Software)
  3. 数据读写

    • 阻塞式读写: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);

常见问题排查

  1. 端口无法打开
    • 检查设备权限(Linux):

      ls -l /dev/ttyUSB0 # 确认所属组是否为 dialout
      sudo usermod -aG dialout $USER # 添加用户到 dialout 组
    • 确认设备未被其他程序占用
  2. 无数据接收
    • 检查接线(TX/RX 交叉连接)
    • 确认波特率、校验位等参数一致
    • 使用 serial->flush() 确保缓冲区清空
  3. 数据错误或乱码
    • 确认数据位、停止位、校验位匹配
    • 检查流控设置(硬件流控需连接 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();
    }
}

调试工具

  1. 终端命令验证串口

    # 发送数据
    echo "test" > /dev/ttyUSB0
    
    
    # 监听数据(需权限)
    sudo cat /dev/ttyUSB0
  2. Qt 调试宏

    // 打印所有可用串口
    qDebug() << "可用串口: " << QSerialPortInfo::availablePorts();

通过合理配置 QSerialPort 并结合信号槽机制,可实现高效可靠的串口通信。

3.关联链接

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

4.关联知识 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值