0

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

我想要我的 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 在运行时无法启动。

4

1 回答 1

1

查看 Qt Serial Port 文档,您似乎想使用QIODevice::readyRead信号连接到会话,该信号将在新字节到达端口时引发。

还有一个关于如何使用这个事件的问题/答案。

于 2016-11-12T00:19:26.677 回答