2011-06-22 5 views
0

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

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

は私のテストの間に、私は頻繁にマーク/スペースパリティ切り替えます。それは問題を引き起こすでしょうか?

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; 
+0

テストの後、シリアルポートの読み取り/書き込み機能をブーストスレッドに入れたときにのみ問題が発生することがわかりました。また、メインスレッドの内部で読み取り/書き込みが行われるときは完璧に動作します。しかし、私はそれのためのスレッド、可能な解決策を使用する必要がありますか? – ruhoo

答えて

1

オーケーSetParity機能で変更部分は、私は最終的に問題を引き起こしていたものを考え出しました。 libserialSerialPortクラスはスレッドセーフではありません。 POSIX信号がおそらくブーストスレッドと競合しています。私はSerialStreamクラスに切り替えることで問題を解決することができました。

+2

あなた自身の答えを受け入れることができることを忘れないでください! –

関連する問題