You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32通过UART向Qt应用发送整数接收失败问题求解

Qt与STM32串口接收问题解决方案

核心问题分析

当前Qt能正常发送5\r帧到STM32,但无法接收STM32发送的字符数据,问题大概率出在Qt接收逻辑的时机或实现方式,以及可能的串口配置/硬件环节。


解决方案1:改用Qt异步信号槽接收(推荐)

Qt串口通信的最佳实践是使用readyRead()信号异步处理接收,同步waitForReadyRead()容易因时机问题导致丢数据。

修改步骤:

  1. 在Uart单例类的初始化代码中,连接信号与槽:
// Uart类构造函数或初始化方法中
connect(serialPort, &QSerialPort::readyRead, this, &Uart::handleSerialData);
  1. 实现接收处理的槽函数:
void Uart::handleSerialData() {
    QByteArray responseData = serialPort->readAll();
    if (!responseData.isEmpty()) {
        QString lastResponse = QString::fromUtf8(responseData);
        // 通过信号将数据传递给UI层
        emit dataReceived(lastResponse);
        qDebug() << "Received data:" << responseData;
    }
}
  1. 在主窗口中绑定信号更新UI:
// 主窗口初始化时
Uart* uart = Uart::getInstance();
connect(uart, &Uart::dataReceived, this, [=](const QString& data) {
    textBrowser->clear();
    textBrowser->append("Received data:");
    textBrowser->append(data);
});

解决方案2:修复同步接收逻辑(如果坚持用同步方式)

若必须使用同步接收,需确保发送后立即刷新串口缓冲区,并优化等待逻辑:

修改Qt发送后的接收代码:

connect(button2, &QPushButton::clicked, [=]() {
    textBrowser->clear();
    Uart* uart = Uart::getInstance();
    QSerialPort* serialPort = uart->getSerialPort();
    QByteArray packet1 = "5\r";
    
    qDebug() << "packet1 :" << packet1 ;
    if (serialPort->isOpen() && serialPort->isWritable()) {
        qint64 bytesWritten = serialPort->write(packet1);
        if (bytesWritten == -1) {
            qDebug() << "Error: Failed to write data to serial port";
        } else {
            // 关键:刷新串口,确保数据立即发送
            serialPort->flush();
            qDebug() << bytesWritten << "bytes written to serial port";
            textBrowser->append("Request send ...");

            // 同步等待接收,延长超时时间
            QByteArray responseData;
            if (serialPort->waitForReadyRead(2000)) {
                responseData.append(serialPort->readAll());
                // 读取剩余缓冲区数据
                while (serialPort->bytesAvailable() > 0) {
                    responseData.append(serialPort->readAll());
                }
            }

            if (!responseData.isEmpty()) {
                QString lastResponse = QString::fromUtf8(responseData);
                textBrowser->append("Received data :");
                qDebug() << "Received data:" << lastResponse;
                textBrowser->append(lastResponse);
            } else {
                qDebug() << "No data received from serial port";
                textBrowser->append("No data received from serial port");
            }
        }
    } else {
        qDebug() << "Error: Serial port is not open or not writable";
    }
    QString style = "color: #AA4A44;";
    textBrowser->setStyleSheet(style);
});

解决方案3:排查硬件与配置问题

  • 确认Qt与STM32的串口参数完全一致:波特率、数据位、停止位、奇偶校验必须相同(例如9600波特率、8位数据位、1停止位、无校验)。
  • 检查STM32发送是否成功:
HAL_StatusTypeDef status = HAL_UART_Transmit(&UartHandle, (uint8_t *)&data, 1, 500);
if (status != HAL_OK) {
    // 发送失败,排查UART配置或硬件连接
}
  • 用第三方串口助手(如SSCOM)验证:先测试STM32是否能正常发送数据,再测试STM32收到5\r后是否会回复,排除硬件或STM32逻辑问题。

解决方案4:统一数据传输格式

如果需要传输整数而非字符,建议明确传输格式:

  • STM32端发送二进制整数:
int32_t num = 123;
HAL_UART_Transmit(&UartHandle, (uint8_t *)&num, sizeof(num), 500);
  • Qt端解析二进制数据:
int32_t receivedNum;
if (responseData.size() == sizeof(int32_t)) {
    memcpy(&receivedNum, responseData.data(), sizeof(int32_t));
    qDebug() << "Received integer:" << receivedNum;
    textBrowser->append(QString::number(receivedNum));
}

内容的提问来源于stack exchange,提问作者Hamza Maxmouri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:58:09