2016-11-11 17 views
0

私のラボでは、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信号を接続します。

+1

'bytesAvailable()'関数を終了するまでのタイムアウトはどのくらいですか?タイムアウトがない場合は、少なくともwhile {...}に遅延を追加してください。 –

+0

良い提案、ありがとうございます。 1秒の遅延が働いていますが、これはマイクロコントローラ上のデータ収集ルーチンの長さを考えると長すぎるようです。 –

+0

マイクロコントローラがご注文を待っている場合は、100msのタイムアウトで十分です。 –

答えて

1

Qtシリアルポートのドキュメントを見ると、QIODevice::readyRead信号を使用してconnect to a sessionにするように見えます。これは、新しいバイトがポートに到着したときに発生します。

また、このイベントの使用方法については、SO question/answerもあります。

+0

ありがとう、私はこれに続き、うまくいった。元の投稿で私の編集を参照してください。 –

+0

聞いてよかったです:-)まだ問題はありますか?もしそうなら、更新はそれを十分にはっきりと記述しません。 –

+0

いいえ、問題ありません。すべての良い仕事。 –

関連する問題