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 串行端口错误 - 未读取数据的主要内容,如果未能解决你的问题,请参考以下文章