シリアルデバイスからOpenWrtルーターにデータを記録しようとしています。
データはすべてASCIIベース、115200ボー、8N1ですが、送信、受信、およびグランドのみが接続されています(フロー制御なし)。デバイスは、1行あたり76文字のテキストを1秒あたり50行送信します(さらにCR + LFは50x78 = 3900文字/秒になり、1文字あたり1スタートビット(?)、8データビット、1ストップビットを考慮します)文字ごとに10ビットが必要と思われるので、利用可能な115200の39,000ビット/秒-それは正しく最大化されるべきではありません?)
問題は、NVRAMに保存しているデータのドロップ、行の切り捨て、マージなどです。そして、これを実行するhead
かcut
、正確に30000行と言った後に停止する場合、正確に10分かかりますが、行数が失われる/切り捨てられる/結合されるため、その行数に達するには11分または12分かかります。たとえば、次の例では、すべての行にまったく同じ数のフィールドが表示されますが、破損した行の3つの例が表示されます。
$label,014704260,000000000,000000000,000000000,000000000,000000000,453266711
$label,014704280,000000000,000000000,000000000,000000000,000000000,498035313
$label,014704300,000000000,000000000,000000000,000000000,000000000,564242105
$label,014704320,190418.30,000000000,000000000,000000000,000000000,458805062
$label,014704340,000000000,000000000,000000000,000000000,000000000,447439419
$label,014704360,000000000,000000000,000000000,000000000,000000000,515812674
$label,014704380,000000$label,014704500,000000000,000000000,000000000,000000000,000000000,430368215
$label,014704520,190418.50,000000000,000000000,000000000,000000000,474793672
$label,014704540,000000000,000000000,000000000,000000000,000000000,514101937
$label,014704560,000000000,000000000,000000000,000000000,000000000,498089337
$label,014704580,000000000,000000000,000000000,000000000,000000000,479420800
$label,014704600,000000000,000000000,000000000,000000000,000000000,568108911
$label,014704620,000000000,000000000,00000000000,497468975
$label,014704640,190418.60,000000000,000000000,000000000,000000000,509747997
$label,014704660,000000000,000000000,000000000,000000000,000000000,441899024
$label,014704680,000000000,000000000,000000000,000000000,000000000,543482880
$label,014704700,000000000,000000000,000000000,000000000,000000000,445069837
$label,014704720,190418.70,000000000,000000000,000000000,000000000,517975535
$label,014704740,000000000,000000000,000000000,000000000,000000000,477103089
$label,014704760,000000000,000000,000000000,483954418
$label,014704860,000000000,000000000,000000000,000000000,000000000,484600994
$label,014704880,000000000,000000000,000000000,000000000,000000000,489675319
また、フィールド2は1行あたり20ずつ増加するミリ秒カウンターであり、フィールド3が存在する場合(5行ごと)はhhmmss.ssです。これは、行が切り捨て/マージされると同時に、3〜5行(0.1秒)も失われることを示しています。
明らかに、何かがボトルネック、遅れ、同期外れ、バッファオーバーランなどになっています。
データの80%または98%を破棄しても満足できます(一貫性がある限り、5行ごとに1行、または50行ごとに1行のみを保持します)が、それらをドロップするための低レベルの十分な方法が見つかりません同じ問題に悩まされることなく。私のようなものを試してみたawk 'NR % 5 == 0' /dev/ttyUSB0
。またの様々な組み合わせを試してみましたなど、またはFIFOにその配管してからのみ、そこからNVRAMにログインせずに、nice -n -19
そしてionice -c 1 -n 0
どの読んでいる私の最初の(awkの)コマンドの「リアルタイム」クラスでなければなりませんttyUSB0から、フィルター処理された(より小さい)データストリームの優先順位を下げます。
このデータをログに記録する、または行をドロップする、たとえばsttyハンドラー内または他の場所で、低レベルの方法またはCPUをあまり使用しない方法はありますか?ttyにより大きなバッファを設定しますか?または、このランダムな失われた/マージされたラインの問題なしに、すべてのデータを保持するか、予測可能にいくつかをドロップするためのここでの私の最善のアプローチは何ですか?
/proc/tty/driver/
シリアルポートの統計情報(たとえば、受信バイトカウントのスナップショットは1秒あたり3900文字に近いですか?)およびオーバーランバイトカウントのファイルを見てください。コードを投稿する場合は、stackoverflow.comで質問してください