2016-11-11 5 views
0

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

+1

Как долго длится тайм-аут перед выходом из функции 'bytesAvailable()'? Если нет тайм-аута, добавьте хотя бы задержку в 'while {...}'. –

+0

Хорошее предложение, спасибо. Задержка на 1 секунду работает, но это кажется чрезмерно длинным, учитывая длину процедуры сбора данных на микроконтроллере. –

+0

Если ваш микроконтроллер только ждет вашего заказа, будет достаточно тайм-аута 100 мс. –

ответ

1

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

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

+0

Спасибо, я последовал за этим и хорошо поработал. См. Мое редактирование в оригинальной публикации. –

+0

Хорошо, приятно слышать :-) Вы все еще наблюдаете за проблемой? Если это так, обновление не описывает это достаточно ясно. –

+0

Нет, проблем нет. Все работает хорошо. –