Qt serial.readall не работает в 5.3.1

serial.readall возвращает пустой буфер в 5.3.1, но тот же кусок кода работает в 5.3.0. кто-нибудь сталкивался с такой же проблемой? Есть ли обходной путь для этого?

Я использую Qt с MSVC 2010 windows 7. Я загрузил "Qt 5.3.1 для 32-битной Windows (VS 2010, OpenGL, 537 МБ)" со страницы загрузок Qt.

Мой код:

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 возвращает пустой буфер. Я получаю ответ от того же HW, когда отправляю тот же вклад от другого инструмента.

1 ответ

Чтение из документации:

QByteArray QIODevice:: readAll ()

Это перегруженная функция.

Считывает все доступные данные с устройства и возвращает их как QByteArray.

Эта функция не имеет возможности сообщать об ошибках; возврат пустого QByteArray() может означать, что в данный момент нет данных, доступных для чтения, или произошла ошибка.

Ключевым фактом здесь является то, что readAll() читает все данные, доступные с устройства, но во время звонка serial.readlAll() у вас нет никаких гарантий, что устройство, с которого вы ожидаете данные, уже ответило...

Я думаю, что тот факт, что кусок кода работает в Qt 5.3.0, является случайным...

Вы должны использовать что-то вроде serial.waitForReadyRead(...) в вашем коде (который будет блокировать выполнение, пока не будет доступных данных для чтения) до вызова serial.readAll() или ЛУЧШЕ вы должны переработать свой код, чтобы подключить функцию к readyRead() сигнал вашего serial объект, а затем прочитать доступные данные из этого слота.

Другие вопросы по тегам