Я создаю графический интерфейс для сбора данных 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 не может быть запущен, когда он уже запущен.
Глядя на документацию Qt Serial Port, похоже, что вы хотите подключиться к сеансу с использованием QIODevice :: readyRead сигнал, который будет подан, когда новые байты поступят в порт.
Существует также SO вопрос ответ о том, как использовать это событие.
Других решений пока нет …