QT Creator串口向Raspberry Pico发送数据失败求助
问题分析与解决方案
核心问题拆解
- 串口发送后直接关闭端口,导致数据未实际发送到Pico(Qt串口写入为异步操作)
- 未初始化QApplication,触发Qt内部定时器相关警告
- 可能缺少Pico期望的命令结束符(对应Hercules切换到Data模式的行为逻辑)
修复后的代码
#include <QSerialPort> #include <QDebug> #include <QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 初始化QApplication,解决定时器警告 QSerialPort serialPort; serialPort.setPortName("COM12"); serialPort.setBaudRate(QSerialPort::Baud115200); serialPort.setDataBits(QSerialPort::Data8); serialPort.setParity(QSerialPort::NoParity); serialPort.setStopBits(QSerialPort::OneStop); serialPort.setFlowControl(QSerialPort::NoFlowControl); if (serialPort.open(QIODevice::WriteOnly)) { // 加入Pico可能需要的换行结束符,匹配Hercules Data模式的行为 QByteArray input = QString("addPoints\r\n").toLocal8Bit(); qint64 bytesWritten1 = serialPort.write(input); qint64 bytesWritten2 = serialPort.write("test\r\n"); // 等待所有数据写入完成,超时设为1000ms if (serialPort.waitForBytesWritten(1000)) { qint64 totalBytes = bytesWritten1 + bytesWritten2; qDebug() << "Data sent successfully, total bytes:" << totalBytes; } else { qDebug() << "Failed to write all data:" << serialPort.errorString(); } serialPort.close(); } else { qDebug() << "Failed to open serial port:" << serialPort.errorString(); } return 0; }
关键修复说明
- 初始化QApplication:QSerialPort依赖Qt事件循环,未初始化会触发内部定时器警告,这就是你看到
QObject::startTimer错误的原因。 - 等待数据写入完成:
serialPort.write()是异步调用,直接关闭端口会导致缓冲区数据被丢弃,waitForBytesWritten()会阻塞直到数据发送完成或超时。 - 添加命令结束符:Hercules的Data模式大概率会自动添加换行/回车作为数据结束标记,Pico的接收逻辑可能需要这个标记识别完整命令,因此在发送字符串后追加
\r\n。 - 统一检查写入操作:原代码仅检查了第一次写入结果,修复后合并统计总发送字节数,确保所有写入操作的状态都被捕获。
内容的提问来源于stack exchange,提问作者StenManne
相关产品推荐
相关产品推荐

