0

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 返回一个空缓冲区。当从不同的工具发送相同的输入时,我得到了来自相同硬件的响应。

4

1 回答 1

0

从文档中读取:

QByteArray QIODevice::readAll()

这是一个过载功能。

从设备读取所有可用数据,并将其作为 QByteArray 返回。

该功能无法报错;返回一个空的 QByteArray() 可能意味着当前没有数据可供读取,或者发生了错误。

这里的关键事实是readAll()读取设备中所有可用的数据,但是在您打电话时,serial.readlAll()您无法保证您正在等待数据的设备已经回答......

我认为这段代码在 Qt 5.3.0 中运行的事实是随机的......

在调用之前,您应该在代码中使用类似的东西serial.waitForReadyRead(...)(这将阻止执行,直到有可用的数据可供读取),serial.readAll()或者更好的是,您应该重新编写代码以便将函数连接到对象的readyRead()信号,serial然后读取可用的来自该插槽的数据。

于 2014-08-27T06:31:34.243 回答