2017-12-02 49 views
-1

Linuxのバージョン:4.9.59LinuxのシリアルポートのRAWモード

プラットフォーム:シリアルにラズベリーパイ3モデルB

USB:FTDI4232

私はマシンからのデータの大きな塊を読みたいです(約4096バイト)。すべての印刷可能なデータはASCII形式です。 データは連続送信されます。ユーザーがデータ転送ボタンを押すとこの操作は30分に1回行われます。 データに複数のCR LFが含まれています。

シリアルポートをRAW入力モードとして設定しました。

config.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOE); 
this->minChars = 5000; 
this->timeOut = 100000; 
if(this->timeOut > 0) 
    config.c_cc[VTIME] = this->timeOut; 
else 
    config.c_cc[VTIME] = 0; 

if(this->minChars > 0) 
    config.c_cc[VMIN] = this->minChars; 
else 
    config.c_cc[VMIN] = 0; 

読み取り機能:私はシリアルポートから読んだとき

ready = epoll_wait(this->epfd, &this->events, 1, this->ePollTimeout); 
returnVal = read(this->fd, readDataBuffer, 8192); 

はしかし、システムが複数のパケットで-への着信ブロブを破壊し、パケットの一部が失われます。

例: :私は278バイトのデータを送った。 システムはこれを3パケットのランダムな長さで分割しました。パケットの長さは実行ごとに変わります。親切なアドバイスをお寄せください。

+0

あなたのコードスニペットは、あなたが本当にrawモードが正しく設定されているかどうかを確認するには不十分です。ヘルプページから: "デバッグヘルプを求める質問("なぜこのコードは動作しないのですか? ")には質問を再現するのに必要な最短コードが含まれていなければなりません。[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)」を参照してください。例えば。 epoll_wait()を使用すると、ノンブロッキング・リードを使用していることがわかります。 – sawdust

答えて

0

readは、指定したバイト数まで読み取りますが、実際には多くのバイトが読み取られることを保証するものではありません。 readの戻り値は、実際に読み取られたバイト数です。通常、readシステムコールは、所望のバイト数が実際に読み取られるか、エラーが発生するか、ファイル/ストリームの終わりに達するまで、whileループに置かれます。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html

+0

文書ごとのRAWモードでは、最初の文字が受信された後、または最小文字数後にタイムアウト値の後に読み取り呼び出しが返されます。 readシステムコールの突然の復帰については説明できません。 –

+0

いいえ、そうではありません。読んだコールにタイムアウトはありません。読み込みの戻り値は何ですか? – tweej

+0

@DarkSorrow * "システムコールの突然の復帰について説明できません。" * - タイムアウト値(つまりVTIME)をゼロにして、純粋にカウントされたリードとなるようにします。あなたが同じ結果を得た場合(おそらく不適切な構成のため)、私は驚くことはありません。 – sawdust

関連する問題