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

建立 TCP 连接后,将TcpClient流包装在StreamReader

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

由于您的分隔符是\r\n,StreamReader.ReadLine将阅读完整的消息:

var reply = reader.ReadLine();

小心为StreamReader每个 TCP 连接创建一次;它可以从底层 TCP 流中读取和缓冲额外的数据以提高效率。

于 2012-06-12T17:17:22.123 回答