私のラボでは、LabVIEWをアプリケーションに置き換えるQtデータ取得GUIを作成しています。タイミングの問題:シリアルポートへのQT書き込みとそれに続く読み取り
シリアルポート(マイクロコントローラに)にデータを書き込み、データ取得が完了するのを待ってから(マイクロコントローラが行う)、プッシュボタンを押してシリアルポートにデータを戻すプロットなど
次のボイドは、受信したシリアルデータをチェックします。これは、シリアルバッファ内のバイト数を表示します。
私がプログラムを実行すると、ボタンをクリックして、最初のクリックで "0"を取得します。 2回目のクリックで正しいバイト数が得られます。
次回押ボタンをクリックするまで、受信しているシリアルデータが利用できないようです。どうしてこれなの?
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.");
}
UPDATE 2016年11月14日
他人のアドバイスに続いて、次のコードが読み、正しく動作一度データの中でプッシュボタンを押した。既に実行されている間、DAQが開始することができないので、
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の使用:私はて、readDataへreadyRead信号を接続します。
'bytesAvailable()'関数を終了するまでのタイムアウトはどのくらいですか?タイムアウトがない場合は、少なくともwhile {...}に遅延を追加してください。 –
良い提案、ありがとうございます。 1秒の遅延が働いていますが、これはマイクロコントローラ上のデータ収集ルーチンの長さを考えると長すぎるようです。 –
マイクロコントローラがご注文を待っている場合は、100msのタイムアウトで十分です。 –