
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);
と書いています。何か問題があるでしょうか。
宜しくお願いします。
No.1ベストアンサー
- 回答日時:
今時、シリアルポートの通信プログラムを書いている人がいるんですね、、懐かしいです。
データ化けしているわけでは無いのでビットレベルの同期はできているようです。
次に同期が必要になるのはブロック単位の同期ですが、これができていない状況です。
read() で読む際には期待する位置に格納(受信)されている保証はありません。
シリアル通信の場合は1バイトづつ読みながら目印になるバイト列が来たらそれからデータが始まると判断をする必要があります。
No.4
- 回答日時:
>int r = read(fd, buff, 7);
実行した時に受信バッファに5バイトしか入っていない場合にどういう挙動になるでしょう?
そして、貴方のコードはそういう場合にどういう挙動をするように記述しているでしょうか?
とりあえず、
man 2 read
してみるとか。
No.3
- 回答日時:
No.1 です。
曖昧性を排除します。
「Linuxでのシリアル通信」という言葉から無手順であることを前提に回答しています。
その場合、手順はプログラマに委ねられています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
Linuxでのシリアル通信について...
-
recv関数の受信結果について
-
「スイッチングハブのバッファ...
-
winsockでソケット通信の開発を...
-
SerialPortのDataReceivedイベ...
-
ReadFile(GPSとの通信)Win7で...
-
シリアルポート通信
-
ClearCommError呼び出し時のCE_...
-
socket: recvはいつ,どれだけ...
-
TCPでの非同期型select関数につ...
-
write関数でEAGAINのエラー発生...
-
Macターミナルで実行中のプログ...
-
TCP/IP通信時のサーバーからの受信
-
Excel(VBA)でSetTimer関数を使...
-
AIXでのプロセス使用メモリの最...
-
FOM出版の公認テキスト&問題集...
-
メッセージボックスのボタン名変更
-
powershell を使いカレントディ...
-
Windows上で、シグナル(SIGTERM...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
winsockでソケット通信の開発を...
-
socket: recvはいつ,どれだけ...
-
「スイッチングハブのバッファ...
-
VB2005でWin32APIを用いてRS-23...
-
シリアル通信エラー
-
シリアル通信の出力バッファと...
-
バイナリデータ受信時のデータ順
-
WinsockAPIのrecvfromの受信デ...
-
SerialPortのDataReceivedイベ...
-
再現性の無いバグ
-
rs232cでの受信データ(mscomm)...
-
C#で通信処理。応答がない場合...
-
Linuxでのシリアル通信について...
-
WriteFile()でのデータ送信がで...
-
【CAsyncSocket::OnReceive()呼...
-
UDP処理のエラーについて
-
recv関数の受信結果について
-
ReadFile(GPSとの通信)Win7で...
-
VC++ HttpOpenRequest() 正し...
おすすめ情報