私には独特の問題があります。
シリアル デバイスとの通信に使用する必要があるカスタム プロトコルは次のように機能します。標準の ASCII 省略形を使用しています。
- -> 私のプログラムは SOH を送信して送信を開始します
- -> 私のプログラムは STX+data+ETX のパケットを送信します (実際には SOH とこのパケットの両方を一度に送信します)
- <- デバイスは、パケットを受信したことを確認するために ACK を返します。
- -> 私のプログラムは EOT を送信して送信の終了を通知します
メッセージが応答を期待する要求であった場合、デバイスはデータを送り返します。方法SerialPort.DataReceived
が機能するため、受信したメッセージを手動でつなぎ合わせる必要があります。次のようになります。
- <- デバイスが SOH+STX+データを送信
- <- デバイスは ETX で終わる追加のバイトを送信します
- -> パッケージ全体が受信されると、私のプログラムは ACK を送信します
- <- デバイスが EOT を送信
これは基本的に、パケットの損失や NAK などを除いて、これら 2 つの通信方法ですが、あまり複雑にしたくありません。
私の問題は次のとおりです。完全なメッセージの送信または完全なメッセージの受信をアトミック操作にラップするにはどうすればよいですか? 私が望んでいないのは、受信したメッセージをつなぎ合わせている最中に、プログラムが新しいメッセージを送信することです。
Monitor.Enter()
andを使用してみMonitor.Exit()
ましたが、受信したイベントは別のスレッドで呼び出されるため、サイコロはありません。
Semaphore
また、リソースが 1 つだけの を使用して、semaphore.WaitOne()
送信または受信の開始時に呼び出しsemaphore.Release()
、EOT を送信した後、デバイスから EOT を受信した後に呼び出してみました。これもなかなかうまくいきません。
これを改善する方法はありますか?