Проблемы синхронизации: запись QT в последовательный порт с последующим чтением

Я создаю графический интерфейс для сбора данных Qt, чтобы заменить LabVIEW для приложения в моей лаборатории.

Я хочу, чтобы на моем графическом интерфейсе была кнопка, чтобы записать некоторые данные в последовательный порт (в микроконтроллер), затем дождаться окончания сбора данных (что делает микроконтроллер) и затем вернуть данные через последовательный порт для сохранения, печати и т. Д. ,

Следующая пустота проверяет поступающие последовательные данные. Он печатает количество байтов в последовательном буфере.

Теперь, когда я запускаю программу, я нажимаю кнопку и получаю «0» при первом нажатии. Второй щелчок дает мне правильное количество доступных байтов.

Похоже, что я не получаю входящие последовательные данные, пока в следующий раз я не нажму кнопку. Почему это?

void MainWindow::on_run_PushButton_clicked(){

sendserialData("go");

quint64 availablebytes = 0;
int i=0;
while(availablebytes < 4 ){ // less than 4 bytes on the incoming serial buffer
availablebytes = microcontroller->bytesAvailable();
qDebug() << availablebytes;
i++;
if(i==4){break;}
}

К вашему сведению, если это важно, вот свойства последовательного порта:

if(microcontroller_is_available){
// open and configure serialport
microcontroller->setPortName(microcontroller_port_name);
microcontroller->open(QSerialPort::ReadWrite);
microcontroller->setBaudRate(QSerialPort::Baud115200);
microcontroller->setDataBits(QSerialPort::Data8);
microcontroller->setParity(QSerialPort::NoParity);
microcontroller->setStopBits(QSerialPort::OneStop);
microcontroller->setFlowControl(QSerialPort::NoFlowControl);

}
else{
QMessageBox::warning(this, "Port error", "Cannot connect to the microcontroller.");
}

ОБНОВЛЕНИЕ 14 ноября 2016

Следуя советам других, следующий код работает должным образом, считывая данные сразу после нажатия кнопки. Я подключил сигнал readyRead к readData:

connect(microcontroller, &QSerialPort::readyRead, this, &MainWindow::readData);

void MainWindow::on_run_PushButton_clicked()
{
ui->run_PushButton->blockSignals(true);
serialData="";
sendserialData("go");
}

void MainWindow::sendserialData(QString command)
{
if(microcontroller->isWritable()){
microcontroller->write(command.toStdString().c_str());
}else{
qDebug() << "Cannot write to the microcontroller";
}
}

void MainWindow::readData()
{
serialData += microcontroller->readAll();
qDebug() << serialData;
ui->run_PushButton->blockSignals(false);
}

Обратите внимание на использование blockSignals, поэтому DAQ не может быть запущен, когда он уже запущен.

0

Решение

Глядя на документацию Qt Serial Port, похоже, что вы хотите подключиться к сеансу с использованием QIODevice :: readyRead сигнал, который будет подан, когда новые байты поступят в порт.

Существует также SO вопрос ответ о том, как использовать это событие.

1

Другие решения

Других решений пока нет …