従来の理由から、限られた仕様しか利用できないサードパーティのデバイスとプログラムが通信できるようにする必要があります。これ自体は実際には問題ではなく、すべてのシリアルエラーを無視するときに問題なく通信できるコードがいくつかあります。
ただし、エラーを無視しないようにしたいと思いますが、問題は、デバイスから受信したすべてのメッセージが最初のバイトでフレーミングエラーを生成することです(メーカー側の奇妙な設計上の決定による)。
デバイスが応答を送信すると、ライン上に6ビット回スペースをアサートし、次に2ビット回マークをアサートしてから、通常のフレーミング(1スペーススタートビット、8データビット、2マークストップビット)に落ち着くようです。 。言い換えると、送信された最初のバイトは5ビットのフレーミングを使用しているように見えますが、後続のすべてのバイトは8ビットのフレーミングを使用しています。または、その最初のバイトは実際には非常に短いブレーク条件です。(この癖を除けば、メッセージ形式はかなりうまく設計されており、明確です。)これは、ある種の割り込みウェイクアップ信号として意図されたものだと思いますが、なぜ同じフレーミングを使用しないのかわかりません。メッセージの残りの部分、または1文字より長い本物の割り込み条件。
当然のことながら、これはOSを苛立たせ、最初の「バイト」を検出するとフレーミングエラーを生成します。現在、このデバイスと通信するためにWindowsベースのプログラムを使用しています(ただし、後でLinuxに移行する可能性があります)。Windowsでは、オーバーラップしたI / Oを使用しReadFileEx
て、実際のデータを読み取り、ClearCommError
エラー状態を検出しています。残念ながら、これは、データとは関係なくフレームエラーが報告されることを意味します。これは、読み取られるデータのチャンク全体(通常は一度に8バイト、場合によってはそれ以上)のエラーとして扱われ、実際にはそうは思えません。さらにローカライズします。
(フレーミングエラーにより、着信メッセージの2番目のバイトも破損することがありますが、幸い、この特定のメッセージ形式の解釈に問題は発生しません。)
ポート処理コードがこれをプロトコル処理コードに渡すことができ、メッセージの重要な部分の外部で発生するエラーを無視できるように、どのバイトが特にフレーミングエラーを引き起こしたかを識別できるようにしたいと思います。しかし、パフォーマンスを低下させたくありません(これは、バイトごとに読み取ろうとした場合に発生すると思われます。それでもうまくいくかどうかはわかりません)。
これを行う良い方法はありますか?それとも、アイデア全体を忘れて、フレーミングエラーを完全に無視したほうがいいでしょうか?