0

私は現在、Ubuntuでのシリアルポート通信にlibserialを使用するプロジェクトに取り組んでいます。MARK/SPACEパリティを許可するようにlibserialソースコードを変更しました。しかし、データ受信テストを行うとき、時々(約5%の確率で)着信データシーケンスが間違っています。最初のバイトは、着信バッファの中央にジャンプすることも、最後にジャンプすることもできます。

問題は元の機能の内部SerialPort::SerialPortImpl::HandlePosixSignal( int singnalNumber) fにあります。エラーが発生すると、一部のバイトを正しく読み取ることができず、エラーの説明は「リソースが一時的に利用できません」です。しかし、すでにnum_of_bytes_availableioctlを使用しているので、どうして失敗する可能性がありますか?

テスト中、私は頻繁にMARK/SPACEパリティを切り替えます。それは問題を引き起こしますか?

SetParity関数内の変更された部分

for **PARITY_SPACE**

port_settings.c_cflag |= CMSPAR | PARENB;

port_settings.c_cflag &= ~PARODD;

port_settings.c_iflag = 0;

for **PARITY_MARK**

port_settings.c_cflag |= CMSPAR | PARENB;

port_settings.c_iflag = 0;
4

1 に答える 1

1

さて、私はついに問題の原因を突き止めました。このlibserial SerialPortクラスはスレッドセーフではありません。POSIX信号がブーストスレッドと競合している可能性があります。SerialStreamクラスに切り替えることで問題を解決することができました。

于 2011-08-02T07:49:07.910 に答える