时序问题:QT写入串口,然后读取

时间:2016-11-11 22:14:44

标签: c++ qt serial-port data-acquisition

我正在制作一个Qt数据采集GUI,以替换我实验室中的应用程序。

我希望GUI上的按钮能够将一些数据写入串口(连接到微控制器),然后等待数据采集完成(微控制器完成),然后通过串口恢复数据以便保存,密谋等。

以下void检查传入的串行数据。它打印串行缓冲区中的字节数。

现在,当我运行程序时,我单击按钮并在第一次单击时得到“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.");
}

2016年11月14日更新

根据其他人的建议,以下代码正常工作,一旦按下按钮,立即读取数据。我将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 个答案:

答案 0 :(得分:1)

查看Qt串行端口文档,看起来您希望connect to a session使用QIODevice::readyRead信号,当新字节到达端口时将会引发该信号。

还有一个关于如何使用此事件的SO question/answer