Я создаю графический интерфейс для сбора данных Qt, чтобы заменить LabVIEW на приложение в моей лаборатории.Проблемы с синхронизацией: запись QT в последовательный порт с последующим считыванием
Я хочу кнопку на моем графическом интерфейсе для записи некоторых данных на последовательный порт (на микроконтроллер), затем дождаться завершения сбора данных (что делает микроконтроллер), а затем вернуть данные через последовательный порт для сохранения , построение графика и т. д.
Следующие входящие данные недействительны для входящих последовательных данных. Он печатает количество байтов в последовательном буфере.
Теперь, когда я запускаю программу, я нажимаю кнопку и получаю «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;}
}
FYI, если это важно, вот свойства последовательного порта:
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 не может быть запущена в то время как он уже запущен.
Как долго длится тайм-аут перед выходом из функции 'bytesAvailable()'? Если нет тайм-аута, добавьте хотя бы задержку в 'while {...}'. –
Хорошее предложение, спасибо. Задержка на 1 секунду работает, но это кажется чрезмерно длинным, учитывая длину процедуры сбора данных на микроконтроллере. –
Если ваш микроконтроллер только ждет вашего заказа, будет достаточно тайм-аута 100 мс. –