Qt 串行端口错误 - 未读取数据

Posted

技术标签:

【中文标题】Qt 串行端口错误 - 未读取数据【英文标题】:Qt Serial Port Errors - Data not getting read 【发布时间】:2013-11-08 21:26:52 【问题描述】:

我正在尝试使用 Qt SerialPort 库读取串行端口。我可以使用超级终端读取数据。

在 Qt 中,我使用以下代码尝试做同样的事情。 Qt 表示端口已正确打开,但由于某种原因,来自串口的 bytesAvailable 始终为 0。

serial.setPortName("COM20");

if (serial.open(QIODevice::ReadOnly))
    qDebug() << "Opened port " << endl;
else
    qDebug() << "Unable to open port" << endl;

serial.setDataBits(QSerialPort::Data8);

serial.setParity(QSerialPort::EvenParity);

serial.setBaudRate(QSerialPort::Baud115200);


qDebug() << "Is open?? " << serial.isOpen();


// Wait unit serial port data is ready
while (!serial.bytesAvailable())

    //qDebug() << serial.bytesAvailable()<<endl;
    continue;


QByteArray data = serial.read(100);

qDebug() << "This is the data -" << data << endl;

serial.close();

相比之下,与上述代码结构相同的MATLAB代码,成功地读取了串口数据

%Serial Port Grapher - Shurjo Banerjee

s = serial('COM20');
s.BaudRate = 460800;
s.Parity = 'even';

try 
    input('Ready to begin?');
catch
end


fopen(s);

fh = figure();
hold on;

t = 1;

 while (s.BytesAvailable <= 0)
        continue
 end
 a = fread(s, 1)

 old_t = 1;
 old_a = a;

while true

   if (s.BytesAvailable > 0)
        a = fread(s, 1)

        figure(fh)
        t = t + 1;
        plot([old_t t], [old_a a]);
        old_t = t;
        old_a = a;
    end
end

fclose(s);

【问题讨论】:

握手通常很少被理解,只是被忽略了。您不能省略对 setFlowControl() 的调用,传递 QSerialPort::HardwareControl。 setStopBits() 也是 awol。 【参考方案1】:

1) 这是错误:https://codereview.qt-project.org/#change,47729

推荐解决方案:


我将 qserialport_win.cpp 中的第 161 行更改为:

return error;

return !error;

现在我的简化示例有效。


2) 我也推荐:

一步:打开端口:

            if (this->open(QIODevice::ReadWrite)) 
             else 
                qDebug() << "\n Can't open port | " << this->errorString();
            

两步:我建议检查参数设置:

            if (
                    this->setBaudRate(this->baudRate)
                    && this->setDataBits(this->dataBits)
                    && this->setParity(this->parity)
                    && this->setStopBits(this->stopBits)
                    && this->setFlowControl(this->flowControl)) 
                qDebug() << "\n[ info ]        Port settings successfully";
             else 
                qDebug() << "\n[ error ]        Port settings failed";
            

如果一切顺利,则建议使用 SIGNAL ReadyRead() 和您的 SLOT 来接收数据。

【讨论】:

以上是关于Qt 串行端口错误 - 未读取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 Qt Designer 接口实时读取串行数据

如何从 Qt5 读取串行数据

虚拟 COM 端口 STM32 和 Qt 串行端口

信号未从线程传递到 GUI

使用串行端口,我收到一个错误:尝试读取或写入受保护的内存

在串行端口(QtSerialPort)读取传入字节的连续流