シリアル ポートからバイト単位で読み取る C++ アプリケーションを作成する必要があります。modbus を使用して無線伝送でメッセージを受信しているため、これは重要な必要性であり、伝送の終了は 3.5 文字の長さの期間で定義されるため、メッセージをバイトごとに取得できなければなりません。現在のシステムは、ハードウェア割り込みを使用してこれを行うために DOS を利用しています。このソフトウェアの OS を Linux に移行したいのですが、この分野の専門知識が不足しています。私はこれを行うために多くのことを試みました - 最初にノンブロッキング読み取りでポーリングを使用し、非常に短いタイムアウト値で選択を使用し、シリアルポートの読み取りバッファのサイズを1バイトに設定し、シグナルハンドラを使用することさえしましたSIGIO、しかし、これらのどれも私が必要とするものをまったく提供しません. 私の上司は、私たちが現在実行している DOS アプリケーションは、ハードウェア割り込みを使用して、シリアル ポートから読み取ることができる何かがある場合に通知を受け取り、ハードウェアに直接アクセスできることを教えてくれました。ユーザー空間の Linux アプリケーションからこの機能を取得する方法はありますか? カスタムドライバーを書いた場合、これを行うことができますか? Linux はハードウェア制御および組み込みデバイス用の非常に人気のある OS であると聞いたので、この種のことが何らかの形で可能になるに違いないと推測していますが、これまで文字通り数週間を費やしてきましたが、具体的な方法はまだわかりません。続行するのが最善です。ユーザー空間の Linux アプリケーションからこの機能を取得する方法はありますか? カスタムドライバーを書いた場合、これを行うことができますか? Linux はハードウェア制御および組み込みデバイス用の非常に人気のある OS であると聞いたので、この種のことが何らかの形で可能になるに違いないと推測していますが、これまで文字通り数週間を費やしてきましたが、具体的な方法はまだわかりません。続行するのが最善です。ユーザー空間の Linux アプリケーションからこの機能を取得する方法はありますか? カスタムドライバーを書いた場合、これを行うことができますか? Linux はハードウェア制御および組み込みデバイス用の非常に人気のある OS であると聞いたので、この種のことが何らかの形で可能になるに違いないと推測していますが、これまで文字通り数週間を費やしてきましたが、具体的な方法はまだわかりません。続行するのが最善です。
1 に答える
文字間の間隔の期間にエンコードされた情報がない限り、バイトごとの読み取りが小数文字の受信にどのように役立つかはよくわかりません。したがって、それらが受信されるタイミングを知る必要があります。
いずれにせよ、シリアル ポート カーネル ドライバーに独自の変更を加える必要があるのではないかと思います。プロジェクトが進むにつれて、それは実際にはそれほど悪いことではありません。多くのことを学ぶことができます。通常は 16 バイト ( 16550 でエミュレートしています) バッファが途中でいっぱいです。dos プログラムのコードは実際に役立つかもしれません。ボーレートが速すぎない場合の代替手段は、カーネルまたはリアルタイム拡張でハードウェアをポーリングすることです (または、HF 無線リンク上にある可能性があるため、ユーザー空間でさえ非常に遅い場合)。
文字受信のタイミングを知る必要があることについて私が正しければ、別のオプションは、受信をデュアル UARTS (または、1 つの UART と 1 つの USB インターフェイス) を備えたマイクロコントローラーにオフロードすることです。次に、マイクロにシリアルストリームを監視させ、受信した1文字とタイムスタンプを含むデータの小さなパッケージをPCに出力します(はるかに高速なボーレートの他のシリアルポートまたはUSBのいずれか)。プロトコルをデコードします。これの良いところは、オペレーティング システムに依存せず、従来のフリー マシンで動作することです (バイト単位のアクセスは、市販の USB シリアル ドングルではおそらく失敗するでしょう)。カスタム ハードウェアを製造する必要はなく、安価な評価ボードを使用して作成することもできます。