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