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
объект, а затем прочитать доступные данные из этого слота.