我有一个系统,其中一端有一个设备通过RS-232与模块通信。 该模块通过TCP连接到PC,并将TCP消息转换为RS-232,反之亦然。
我就是这样做的:
我目前处理此问题的代码是
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()
我不太关心常量字符串的构建,所以我想知道是否有更好的方法可以做到这一点?
答案 0 :(得分:4)
建立TCP连接后,将TcpClient
流包裹在StreamReader
中:
var reader = new StreamReader( stream, Encoding.ASCII );
由于您的分隔符为\r\n
,StreamReader.ReadLine
会读取完整的消息:
var reply = reader.ReadLine();
小心为每个TCP连接创建一次StreamReader
;它可以从底层TCP流中读取和缓冲其他数据以提高效率。