3

まず、C# でコーディングしています。ソケットを介してさまざまなサイズのデータ​​をデバイスに書き込んでいます。すべてのデータの処理が完了すると、デバイスはエラー コード/完了メッセージを書き戻すため、データを書き込んだ後、ソケットから読み取りたいと思います。現在、私は次のようなものを持っています:

byte[] resultErrorCode = new byte[1];
resultErrorCode[0] = 255;

while (resultErrorCode[0] == 255)
{
    try
    {
        ReadFromSocket(ref resultErrorCode);
    }

    catch (Exception)
    {
    }
}
Console.WriteLine(ErrorList[resultErrorCode[0] - 48]);

他の場所で使用ReadFromSocketしているので、正常に動作していることを知っています。最終的には、(自分のマシンで) から接続しているポートがランダムなポートに変更されます。これが原因で相手側のファームウェアの接続が悪いのだと思います。そのため、反対側にデータを書き込むと、接続した元のポートにデータを書き込もうとしますが、何度か読み込もうとすると、接続ポートが変更されます。

完了コマンドを受信するまでソケットから連続して読み取るにはどうすればよいですか? 私の最小のテストファイルでは、かなり一貫して1分13秒かかるため、ループに何か問題があることがわかっている場合。ループを削除し、コードを 1 分 15 秒間スリープ状態にして、コードをテストしました。再開すると、期待している完了コマンドを正常に読み取ります。誰かアドバイスはありますか?

4

1 に答える 1

1

必要なのは、外部ハードウェアのドライバーのように機能する別のスレッドです。このスレッドはすべてのデータを受け取り、それを解析して、適切なメッセージをアプリケーションの残りの部分に送信します。コードのこの部分から、ハードウェアからデータを受信して​​解析する方法がわかります。

  public void ContinuousReceive(){
    byte[] buffer = new byte[1024];
    bool terminationCodeReceived = false;
    while(!terminationCodeReceived){
      try{
          if(server.Receive(buffer)>0){
             // We got something
             // Parse the received data and check if the termination code
             // is received or not
          }
      }catch (SocketException e){
          Console.WriteLine("Oops! Something bad happened:" + e.Message);
      }
    }
  }

ノート:

  1. マシンで特定のポートを開きたい場合 (一部の外部ハードウェアは事前定義されたポートと通信するように構成されています)、ソケットを作成するときにそれを指定する必要があります。
  2. アプリケーションを停止するか、外部ハードウェア API で必要になるまで、ソケットを閉じないでください。ソケットを開いたままにしておくと、ランダムなポートの変更が解決されます
  3. Thread.Sleep外部ハードウェアを扱うときに使用することはお勧めできません。可能であれば、イベント (RS232 接続の場合) を使用するか、上記のコードのように別のスレッドで呼び出しをブロックする必要があります。
于 2012-06-29T22:13:03.043 に答える