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;
どんな助けもありがとう。
多くのことが間違っている可能性があります。シリアルポートが開いている場合、最初の読み取りの前に確認しますか? waitForReadyReadを使用していますか? –
NULLを送信し、 'ブレーク'は同じではありません。 「ブレーク」とは、ラインが長時間(ゼロ時間以上)ゼロになるときです。ブレークにはスタートビットはありません。そのため、受信者はNULLも含めて文字を見るべきではありません。 NULL文字列を見るには、各文字に関連する開始ビットが必要です。ノイズ(誤った開始ビットとして表明される)が原因で問題が発生したり、シリアルポートドライバの問題が発生したり、相手側が実際にNULL文字列を送信する可能性があります。 – Mark
私はreadyRead()を使って、ポートからの読み込みを待ちますが、waitForReadyRead()は使用しません。シリアルポートが最初に開いているかどうかはチェックしていませんが、オープンしていないとエラーが出ます(これは私には分かりません)。ありがとうございました、休憩に関する情報、操作を理解していませんでした。私は、私が伝えることができるドライバーの問題を持っていないようで、モジュールはこのデータの蒸気を送るべきではありません。これらのコメントの後、私はそれがreadyRead()の問題になるかもしれないと思う傾向がある...私はそれが問題になるかもしれないと聞いた。 – SamMetix