シリアルポートから100hzでデータを100バイト読み取っています。私のバッファは1024バイトなので、私のバッファは完全には使用されません。しかし時には、私はシリアルポートからしゃっくりを取得し、バッファがいっぱいになる。バッファリング不完全高速読み取り
私のデータは、[ヘッダ]データ[チェックサム]として編成されています。バッファがいっぱいになると、シリアルポートからの2回の読み込みでメッセージ/データが分割されることがあります。
これは簡単な問題です。さまざまなアプローチがあります。私は予定より早く、異なるアプローチを研究したいと思います。 2つの読み込みからまとめなければならないかもしれない高速データのバッファリングをカバーするいくつかのパラダイムを挙げることができますか?この問題では、私が行った他のバッファリング(画像取得、tcp/ip)からの主な違いは、完全なパケット/メッセージが保証されていることです。ここで、「パケット」は複数の読み込み間で分割されてもよく、データの解析を開始するとわかります。
はい、読み取りからバッファリングされたデータは解析する必要があります。そのため、単純にするには、データが解析に達したときに連続している必要があります。その後、以前からバイトを超える左後の読み取りでそれを埋める、私の元のバッファに未使用のバイトを超える
- キャリー:私が持っていた
いくつかのアイデアを(プラス私はパーサの責任だとは思いません)読む。 (たとえば、1024バイトを読み込み、最後に24バイトが残っていますが、それらは部分的なメッセージです。read_buffer_の先頭にmemcpy、先頭に24を渡して1024から24まで読み込みます)
- 作成データのブロックを取得する自分のクラス。読み取り/書き込みと大きなメモリ(1024 * 4)の2つのポインタがあります。データを渡すと、クラスは書き込みポインタを正しく更新し、最後に到達するとバッファの先頭にラップします。私はリングバッファのように思う?
- おそらく
std::vector<unsigned char>
を使用していると考えていました。動的メモリ割り当て。連続していることが保証されています。
おかげさまで、
std :: vectorは、非常に簡単で効率的なソリューションを提供します。それぞれの読み込みに新しいchar []を割り当てて、それをベクトルに追加してから、それが解析されたら削除してください。 –
'他のバッファリング(画像取得、tcp/ip)は、完全なパケット/メッセージが保証されていることです.' - あなたはTCP/IPの"完全なパケット/メッセージ "を保証していません。 –
ああ、私はいつもいつも運が良かったと思う。私は、TCP/IPパケットが標準サイズであると思って、スライディングウィンドウのようなパケットとアルゴリズムを使って完全なメッセージを構築しました。 TCP/IPの私の唯一の経験は、大学のプロジェクトだったことを告白します。 – Constantin