Qt serial.readall 在 5.3.1 中不起作用
Posted
技术标签:
【中文标题】Qt serial.readall 在 5.3.1 中不起作用【英文标题】:Qt serial.readall is not working in 5.3.1 【发布时间】:2014-08-22 08:55:54 【问题描述】:serial.readall
在 5.3.1 中返回一个空缓冲区,但同一段代码在 5.3.0 中工作。有人遇到过同样的问题吗?有什么解决方法吗?
我在 MSVC 2010 windows 7 中使用 Qt。我从 Qt 下载页面下载了“Qt 5.3.1 for Windows 32-bit (VS 2010, OpenGL, 537 MB)”。
我的代码:
portname=ui->lineEdit->text();
serial.setPortName(portname);
if(serial.open(QIODevice::ReadWrite))
ui->pushButton_5->setText("Device Connected");
ui->pushButton_5->setStyleSheet("background : yellow");
if(!serial.setBaudRate((QSerialPort::Baud115200),QSerialPort::AllDirections))
qDebug()<<serial.errorString();
if(!serial.setDataBits(QSerialPort::Data8))
qDebug()<<serial.errorString();
if(!serial.setParity(QSerialPort::NoParity))
qDebug()<<serial.errorString();
if(!serial.setStopBits(QSerialPort::OneStop))
qDebug()<<serial.errorString();
if(!serial.setFlowControl(QSerialPort::HardwareControl))
qDebug()<<serial.errorString();
else
qDebug()<<"Serial port not opened. Error: "<<serial.errorString();
QTest::qSleep(2000);
exit(0);
serial.write(outbuff, l);
rsp=(serial.readAll()).toHex();
serial.readAll 返回一个空缓冲区。当从不同的工具发送相同的输入时,我会从相同的硬件得到响应。
【问题讨论】:
您能否提供一些代码,以便我们可以轻松准确地重现您的场景? 我在下面发布了一个答案...请检查一下并告诉我它是否能解决您的问题 【参考方案1】:阅读文档:
QByteArray QIODevice::readAll()
这是一个重载函数。
从设备中读取所有可用数据,并将其作为 QByteArray。
此函数无法报错;返回一个空 QByteArray() 可能意味着当前没有数据可用于 读取,或发生错误。
这里的关键事实是readAll()
从设备读取所有可用数据,但是在您调用serial.readlAll()
时,您无法保证您正在等待数据的设备已经回答...
我认为这段代码在 Qt 5.3.0 中运行的事实是随机的......
在调用serial.readAll()
或更好之前,您应该在代码中使用serial.waitForReadyRead(...)
之类的东西(这将阻止执行,直到有可供读取的数据)或更好,您应该重新编写代码为了将函数连接到serial
对象的readyRead()
信号,然后从该插槽读取可用数据。
【讨论】:
我什至尝试过 serial.waitForReadyRead() 总是返回 false。正如我所说,同一段代码在 5.3.0 中有效。它不是随机的。问题出在5.3.1。谢谢。以上是关于Qt serial.readall 在 5.3.1 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Windows XP 上的 QMediaPlayer (qt 5.3.1)
Linux Mint x64:Qt 5.3.1 插件部署:不兼容的 qt 库
Qt 5.3.1 应用程序错误:无法找到或加载 Qt 平台插件“windows”