3

私は、RS-232 経由でモジュールと通信するデバイスを一方の端に持つシステムを持っています。モジュールは TCP 経由で PC に接続され、TCP メッセージを RS-232 に、またはその逆に変換します。

これは私がそれを行う方法です:

  1. ストリーム上のすべてのバイトを読み取ります
  2. 文字列を構築する
  3. 文字列の後半部分を区切り文字と比較します
  4. 次に、ストリームの読み取りを停止します (ここには示されていませんが、イベントを発生させます)。

これを処理するための私の現在のコードは

        string delimiter = "\r\n";
        byte[] reply = new byte[1];
        string replyString = string.Empty;
        bool readOk = true;
        int dl = delimiter.Length;
        bool delimiterReached = false;

        do
        {
            try
            {
                stream.Read(reply, 0, 1);
            }
            catch (Exception e)
            {
                readOk = false;
                break;
            }

            replyString += Encoding.ASCII.GetString(reply, 0, reply.Length);

            int rl = replyString.Length;

            if (rl > dl)
            {
                string endString = replyString.Substring(rl-dl, dl);
                if (endString.Equals(delimiter))
                    delimiterReached = true;
            }

        } while (!delimiterReached);

はどこstreamですかTcpClient.GetStream()

一定の文字列の構築はあまり気にしないので、これを行うためのより良い方法があるかどうか疑問に思っていましたか?

4

1 に答える 1

4

TcpClientTCP 接続が確立されたら、ストリームを次のようにラップしStreamReaderます。

var reader = new StreamReader( stream, Encoding.ASCII );

区切り文字が\r\nであるため、StreamReader.ReadLineは完全なメッセージを読み取ります。

var reply = reader.ReadLine();

StreamReaderTCP 接続ごとに 1 回作成するように注意してください。効率のために、基礎となる TCP ストリームから追加のデータを読み取ってバッファリングする場合があります。

于 2012-06-12T17:17:22.123 に答える