Armadilloフォーラム

シリアル通信読取データの文字抜けについて

yousuke-mibu

2019年8月9日 16時09分

お世話になります。

シリアル通信の受信データをssize_t read(int fd, void *buf, size_t count)
で読みだしたところ、まれに特定の文字が抜けるという現象が発生します。

例)
送信側のデータ
30 31 32 34 39 38 37 30 38 31 31 30 37 36 31 36 31 37 32 32 30 32 30 30 33 30 31 1d 31 30 41 42 43 31 32 33 34 0d 30 31 31 34 39 38 37 30 38 31 31 30 37 36 31 39 0d

受信したデータ
31 32 34 39 38 37 38 31 31 37 36 31 36 31 37 32 32 32 33 31 1d 31 41 42 43 31 32 33 34 0d 31 31 34 39 38 37 38 31 31 37 36 31 39 0d
(0x30が抜けている)

発生時は以下の様な状況になります。
・抜ける文字は決まっていない(「0x39」が抜けた事もある)
・電源ON時から発生し、発生以降はずっと同じ文字が抜け続ける。
 (送信側のデータを違うものにした場合も、同じ文字が抜ける。)
・電源OFF→ONをすると直る。

上記のような現象について、考えられる原因がありましたら
ご教授いただけないでしょうか。

以上、よろしくお願い致します。

コメント

at_kojiro.yamada

2019年8月9日 16時32分

termiosの設定で、未初期化の変数を使っていたりしないでしょうか?
termios構造体の初期化処理を見直してみてください。

termios構造体のc_cc[NCCS]メンバでいくつかの制御文字を指定できます。
このメンバをゼロクリアせずに使用した場合、プログラムを起動するたびにランダムに制御文字が設定されてしまいます。
制御文字はカーネルの方で処理された際に受信文字列から取り除かれるので、今回のような現象に繋がる可能性があります。

at_kojiro.yamada

2019年8月9日 18時17分

> termios構造体のc_cc[NCCS]メンバでいくつかの制御文字を指定できます。
> このメンバをゼロクリアせずに使用した場合、プログラムを起動するたびにランダムに制御文字が設定されてしまいます。

訂正します。
ゼロクリア→未初期化です。

=====
このメンバを未初期化のまま使用した場合、プログラムを起動するたびにランダムに制御文字が設定されてしまいます。
=====