c++ - POSIX読み取りの一時停止をマイクロ秒の範囲で認識する

原文 c++ linux posix

C++ / LinuxでJ1708プロトコルを実現する必要があります。これをユーザー空間で完全に実装したいのですが、それが可能かどうかわかりません。

問題は、メッセージがビット時間でのみ分離されることです。ビット時間はボーレート1/baudrateに対応し、J1708で9600bpsのボーレートは約104.17マイクロ秒です。このプロトコルのすべてのメッセージは、2ビット時間(208.34us)で区切られた文字で構成されます。いわゆる「文字間ビット時間」と呼ばれます。メッセージは未確定の文字数で構成され、10ビット時間(1041.7us)の一時停止がある場合、オーバー/完全です。

私の考えは、ブロッキングモードバイトでPOSIX端末インターフェイスを介して読み取り、メッセージの終わりを認識するまでの時間を数えることです。
私のアプローチでこれを実現する機会はありますか、または誰かがより良いアイデアを持っていますか?

SAE J1708リファレンス:http://read.pudn.com/downloads133/ebook/567787/saej1708v002.pdf
答え
これはハードウェアに大きく依存します!あなたはそれを保証できますか?


UARTがFIFOモードではありません。もしそうなら、いくつかの文字がバッファリングされます
ハードウェアなので、タイミングの仮定に別れを告げることができます。
他のタスク(ユーザースペースまたはカーネル)が読み取りを中断し、1ミリ秒以上続くことはありませんか?
文字ごとに異なる読み取りイベントが発生しますか?これは最初の仮定(ハードウェアFIFOなし)に似ていますが、ドライバー側にあります。


ボーレートが遅い場合、1と3を達成できる可能性があります。

LinuxのようなOSでこれを実装することは不可能であるか、非常に非効率的です(つまり、すべての処理時間をハードウェアのポーリングに費やしています)。

この種の「プロトコル」は、FPGAまたはマイクロコントローラーでより適切に処理されます。つまり、PICデモボードを使用して、PICボード上​​のメッセージをデコードし、Linuxプロセッサに送信します。
関連記事

c++ - Qtで、モデルからリストビューのアイテムの背景色をリセットするにはどうすればよいですか?

c++ - 実装ファイルでコンストラクタを使用するにはどうすればよいですか?

c++ - cursesライブラリーの使用時にmove()またはwmove()を使用するとカーソルが移動しない

c++ - プログラムでシステム情報を開く

c++ - Boost::Spiritを使用してエスケープされた文字列を解析する

java - 乱数をテストする[終了]

c++ - Qt CreatorとGCC

c++ - DLLが機能しない

c++ - Win32のアニメーションとイベントの質問(C++)

c++ - SWIGでSFMLクロスプラットフォームのtypedefを取得する