Qt6 Windows平台下QSerialPort的readyRead信号不触发问题求助
Qt6 Windows平台下QSerialPort的readyRead信号不触发问题求助
我最近在Windows上用Qt6的QSerialPort做项目时碰到了个棘手的问题:明明已经成功建立了COM口连接,也把readyRead信号和我的onDataReceived()槽函数连起来了,但这个接收函数就是从来没被触发过!
数据是用Teensy 4.1通过Serial.write()以高速二进制格式发出来的,我换别的库测试过,数据传输完全没问题,所以问题肯定出在Qt这边的配置或者代码上,有没有大佬能给我支支招?
以下是几个我自己踩坑后总结的排查方向,你可以试试看:
- 先确认信号槽连接是否真的成功!有时候不小心拼错函数名,或者用了不合适的连接参数(比如Qt6里
connect的重载要注意,有没有指定连接类型?),可以在connect语句后打印返回值,要是返回false,那肯定是连接没建立起来,信号自然传不过去。 - 核对串口参数是否和Teensy完全一致!波特率、数据位、停止位、奇偶校验,哪怕有一个参数不匹配,都可能导致接收不到数据,或者触发不了
readyRead信号。比如Teensy设的是115200波特率,Qt这边要是写成9600,那肯定收不到。 - 试试手动读取数据!在串口连接成功后,加个短延迟然后调用
readAll()或者waitForReadyRead(1000),看看能不能读到数据。如果手动能读到,那大概率是信号槽连接的问题;如果手动也读不到,那可能是Windows下的串口权限、驱动问题,或者串口被其他程序占用了。 - 调整串口缓存大小!高速传输时,Windows的串口驱动可能会攒够一定量的数据才触发
readyRead信号,你可以试试用setReadBufferSize()设置一个合适的缓存大小,比如和Teensy每次发送的数据包大小匹配的值。 - 检查Qt6的串口打开模式!打开串口时有没有用
QIODevice::ReadWrite模式?要是只开了只读或者只写,那也会出问题。另外,用QSerialPortInfo获取串口设备时,有没有选对对应的COM口?
备注:内容来源于stack exchange,提问作者Alejandro Fernández Suárez
相关产品推荐
相关产品推荐

