0

シリアルポートを使用して外部マシンと通信しようとしていますが、何をしたか、肯定応答を取得するコマンドを送信し、次に ENQ を送信し、出力でここに最終応答を表示する必要があります。

最初の問題は、出力結果が3回繰り返されることです。プログラムでループを使用していないため、奇妙です。

2 番目の問題は、結果を抽出して応答 BCC を計算することです。バッファーから読み取り、バッファーから抽出する方法がわかりません。

4

1 に答える 1

1

シリアル通信ポートまたは他のタイプの低速データ転送メカニズムを使用する場合、CPU はおそらく低速通信ポートを介したデータ転送よりもはるかに高速であることを考慮する必要があります。

このスタックオーバーフローのシリアルポートからのデータの解析/フォーマット - C#をご覧になることをお勧めします。

2 つ目の問題は、バイト ストリーム内のさまざまなメッセージを分離する構造をバイト ストリームに配置することです。通常、このアプローチは、ソフトウェアのさまざまな領域が通信問題のさまざまな側面または部分に対処できるように、OSI モデルに似た一種のプロトコル スタックである一連のレベルのソフトウェアを用意することです。

シリアル通信ポートには、通常、開始インジケータ バイト、一連のメッセージ バイト、および終了インジケータを指定するある種のプロトコルがあります。

このプロトコルは、送信者と受信者がバイト ストリームを取得して個々のメッセージに分割できるように、転送される実際のメッセージを指定します。これらの個々のメッセージは、実際に解析して何らかのアクションを実行するために、他の関数に提供されます。

ソースを読むと、よりモジュール化され、より階層化されたアプローチへのアプローチを再考する必要があるようです。

たとえば、ポート インターフェイス レイヤーは、バイトをメッセージに組み立てるために、個々のバイトを処理する必要があります。これに対して私がとるアプローチは、有限状態マシンアプローチを使用することです (状態マシン - コンピューター サイエンスの基本も参照してください)。また、オブザーバー パターンを使用して、メッセージが組み立てられると、組み立てられたメッセージを必要とするオブジェクトがリスナーとして登録され、組み立てられたメッセージが提供されるようにします。

したがって、通信ポート イベントを処理するオブジェクトが必要になります。このオブジェクトは、通信ポートからバイト ストリームを読み取り、ストリームから個々のメッセージのバイト配列を組み立てます。これは、通信ポートと対話するオブジェクトが 1 つだけであることを保証するシングルトン オブジェクトであり、このオブジェクトには、通信ポートにメッセージを書き込むメソッドも含まれていると思います。

このオブジェクトは、他のオブジェクトが通信ポート メッセージに登録できるように、オブザーバー パターンも実装します。完全なメッセージが受信されると、通信ポート オブジェクトはそれをすべての登録済みリスナーに提供します。

于 2012-12-10T03:08:41.620 に答える