
Linux 上の RS232 ライン内の文字間時間を検出するために、C でコードを作成する必要があります。検出する文字間時間は 1 ミリ秒になる可能性があります。そのため、入力文字に非常に高速にタイムスタンプを付ける方法が必要です。非常に高速というのは、1 ミリ秒未満です。目標は、ライン上のフレームの終了と新しいフレームの開始を検出することです。
コーディング ソリューションを求めているのではなく、どのような手順を踏む必要があるかを知るための最初の支援が欲しいだけです。Linux でこれを行うことは可能ですか? このような時間に到達するにはドライバーを変更する必要がありますか? または、ユーザー スペースで実行できるものはありますか (そうは思いません)。
答え1
それはオンボード UART ですか、それとも USB ドングルですか? 前者の場合、シリアル ドライバーの割り込みルーチンを変更して、データをタイムスタンプとともに保存し、タイムスタンプ付きのデータをユーザー空間に配信して、ユーザー空間で整理できるようにします。Linux はリアルタイムではありませんが、1 ミリ秒未満ですべての割り込みに応答できると予想されるため、これで十分でしょう。
USB ドングルの場合、usbmon
すでにマイクロ秒単位のタイムスタンプが提供されているため、通常のシリアル USB ドライバーと一緒に使用したり、シリアル USB ドライバーを変更してそれらのタイムスタンプにアクセスできるようにしたりできるはずですusbmon
。
答え2
Linux 上の RS232 行内の文字間の時間を検出するには、C でコードを実行する必要があります...
投稿しましたXY問題。
1 ミリ秒を超える無音はフレームの終了と新しいフレームの始まりを意味するため、これを実行したいのです。
(ちなみにRS-232などの非同期シリアル通信では、"フレーム"すべての文字がフレーム化されているため、あいまいです。たとえば、UART が「フレーミング エラー」を報告する場合、文字が (おそらく) 失われています。おそらく、実際にはパケットまたはメッセージ ユニットを意味していると思われます。
あなたの追加コメントにより、解決が必要な実際の X の問題がようやく明らかになりました。
実際の問題はメッセージ間のギャップを検出することであるため、Y に関する元の質問はソフトウェアで正確に実装するのが難しいだけでなく、X の問題に対する実行可能な解決策でもありません。
メッセージ間のギャップを検出するためにソフトウェアで受信文字間の時間間隔を「測定」するソリューションはどれも欠陥のあるソリューションです。このアプローチは、
メッセージの最後の文字が到着し、それ以上文字がない場合(しばらくの間)、最後に受信したメッセージは行き詰まったアルゴリズムが次の文字 (次のメッセージの最初のバイト) を待機している間、時間差を計算できるまで無期限に続きます。
その「次の文字」が受信されない限り、「メッセージの終わり」は決定されず、最後の有効なメッセージは完了しますが、処理されません。
適切な解決策は、文字が受信されたか、あるいは受信されなかったかを測定できるハードウェアを使用することです。一部のAtmel USARTには、受信タイムアウトメッセージ間のギャップを検出する機能。
考えられるソフトウェア ソリューションには、U(S)ART ドライバーが受信文字間の時間間隔をカウントするために使用する (高解像度の) 周期タイマーが必要です。DMA の代わりに PIO を使用すると、ドライバーは各文字を受信するたびに間隔のカウントをリセットする必要があります。カウントがしきい値を超えると (つまり、count * interval_time > inter_message_gap_time)、受信側が長時間沈黙しており、メッセージ間ギャップがあることを示します。