2016-07-29 9 views
0

QSerialPortから読み取るプログラムを作成しています。プログラムは約85%の時間で動作しているようですが、ナンセンスがバッファーに読み込まれているという奇妙な状況が発生しています。QSerialPort:不正な値を読み取る

時々、x00値の大きなバッファのためにプログラムが予期せずクラッシュします。これは私のモジュールからの応答ではなく、起動時にのみ時折発生するようです。

QSerialPortのインスタンスを削除する方法に問題があると思いますが、それを見つけることができないようです。

私も気付いたQSerialPortには、私のプログラムが何をしているように見える( "x00/x00/x00の大量の蒸気"という)機能 "sendBreak"があります。

私の質問は、これまでに遭遇したことはありますか?私のQSerialPort :: read()関数が何とか "sendBreak"を実行しているという奇妙な可能性はありますか?あるいは、インスタンス/ポインタの削除(正しく解体されなかったアドレスからのデータの読み込み)で、これが問題になる可能性は高いですか?

コンストラクタ:

serial = new QSerialPort; 
    serial->setPortName("/dev/ttyUSB0"); 
    serial->setBaudRate(QSerialPort::Baud9600); // 9600 
    serial->setDataBits(QSerialPort::Data8); 
    serial->setParity(QSerialPort::NoParity); 
    serial->setStopBits(QSerialPort::OneStop); 
    serial->setFlowControl(QSerialPort::NoFlowControl); 
    serial->open(QSerialPort::ReadWrite); 
    serial->clear(QSerialPort::AllDirections); 

読むポート:

readData.append(serial->read(50)); 

デストラクタ:私はこれはかなり一般的な質問かもしれ実現が、私は現在、そう問題を見つけることができません

serial->clear(QSerialPort::AllDirections); 
serial->close(); 
delete serial; 

どんな助けもありがとう。

+0

多くのことが間違っている可能性があります。シリアルポートが開いている場合、最初の読み取りの前に確認しますか? waitForReadyReadを使用していますか? –

+0

NULLを送信し、 'ブレーク'は同じではありません。 「ブレーク」とは、ラインが長時間(ゼロ時間以上)ゼロになるときです。ブレークにはスタートビットはありません。そのため、受信者はNULLも含めて文字を見るべきではありません。 NULL文字列を見るには、各文字に関連する開始ビットが必要です。ノイズ(誤った開始ビットとして表明される)が原因で問題が発生したり、シリアルポートドライバの問題が発生したり、相手側が実際にNULL文字列を送信する可能性があります。 – Mark

+0

私はreadyRead()を使って、ポートからの読み込みを待ちますが、waitForReadyRead()は使用しません。シリアルポートが最初に開いているかどうかはチェックしていませんが、オープンしていないとエラーが出ます(これは私には分かりません)。ありがとうございました、休憩に関する情報、操作を理解していませんでした。私は、私が伝えることができるドライバーの問題を持っていないようで、モジュールはこのデータの蒸気を送るべきではありません。これらのコメントの後、私はそれがreadyRead()の問題になるかもしれないと思う傾向がある...私はそれが問題になるかもしれないと聞いた。 – SamMetix

答えて

0

[OK]を、それは私が問題を見つけた価値がある。再読み込みのQt QSerialPort上の文書、具体的に、読み取り後

()それが言う機能:この関数は、エラーを報告する方法がありません

」;空QByteArrayを返すと、どちらかのデータがために、現在利用できなかったことを意味しますまたはエラーが発生したことを示します。

私のreadyRead()信号は、読み込むデータがなくても起動されていますか?私のreadPortメソッドでbytesAvailable()をチェックする単純なif文は、読み込みを待っているデータがあるときだけ読み込むことを意味します。 ....

私は、この機能に関係なく読み取るように、非常に驚​​いて、この問題をよりよく扱っ/ハイライトされていたかもしれないと感じ

EDIT:この問題への現実的な問題を発見しました。私はそれをインスタンス化せずに配列をクリアしていたreadData.resize()を使用していました。したがって、私は読書の前にそれをクリアしていたが(初期化されていない)、それはアドレスを読んでいた。

関連する問題