アプリ版:「スタンプのみでお礼する」機能のリリースについて

Linuxでのシリアル通信についてですが、受信のときにデータがずれた状態で送られてくることがあります。

例えば、正常なデータが以下のような場合
rtc[0] = 7
rtc[1] = 83
rtc[2] = 0
rtc[3] = 4
rtc[4] = 5


たまに
rtc[0] = 0
rtc[1] = 7
rtc[2] = 83
rtc[3] = 0
rtc[4] = 4


rtc[0] = 0
rtc[1] = 0
rtc[2] = 7
rtc[3] = 83
rtc[4] = 0


rtc[0] = 83
rtc[1] = 0
rtc[2] = 4
rtc[3] = 5
rtc[4] = 0


といった結果になります。

プログラムでは、7バイト分読み込む場合は

unsigned char buff[7];



int r = read(fd, buff, 7);


と書いています。何か問題があるでしょうか。
宜しくお願いします。

A 回答 (4件)

今時、シリアルポートの通信プログラムを書いている人がいるんですね、、懐かしいです。


データ化けしているわけでは無いのでビットレベルの同期はできているようです。
次に同期が必要になるのはブロック単位の同期ですが、これができていない状況です。
read() で読む際には期待する位置に格納(受信)されている保証はありません。
シリアル通信の場合は1バイトづつ読みながら目印になるバイト列が来たらそれからデータが始まると判断をする必要があります。
    • good
    • 0
この回答へのお礼

1バイトずつ読みながら、ですか。
ありがとうございます。

お礼日時:2017/08/25 19:45

>int r = read(fd, buff, 7);



実行した時に受信バッファに5バイトしか入っていない場合にどういう挙動になるでしょう?
そして、貴方のコードはそういう場合にどういう挙動をするように記述しているでしょうか?

とりあえず、
man 2 read
してみるとか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2017/08/30 17:06

No.1 です。


曖昧性を排除します。

「Linuxでのシリアル通信」という言葉から無手順であることを前提に回答しています。
その場合、手順はプログラマに委ねられています。
    • good
    • 0

シリアル通信は、トランシーバの様に交互に話し手と聞き手を切り替えて


会話(通信)を行います。
その為に、双方に共通な手順(プロトコル)を持っている必要が有りますが
それは、ちゃんとしているのでしょうか?
    • good
    • 0
この回答へのお礼

自分ではしているつもりですが、再度確認したいと思います。

お礼日時:2017/08/26 17:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています