【问题标题】:Qt serial.readall is not working in 5.3.1Qt serial.readall 在 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 返回一个空缓冲区。当从不同的工具发送相同的输入时,我会从相同的硬件得到响应。

【问题讨论】:

  • 您能否提供一些代码,以便我们可以轻松准确地重现您的场景?
  • 我在下面发布了一个答案...请检查一下并告诉我它是否能解决您的问题

标签: qt qtserialport


【解决方案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。谢谢。
猜你喜欢
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多