While循环即使语句为false也不会结束

本文关键字:结束 false 循环 语句 While | 更新日期: 2023-09-27 18:00:48

我正在编写一个WinForm应用程序,通过串行端口控制编码器引擎。协议很简单,我发送第一个命令要求引擎移动,第二个命令确认它在新位置,其他地方以此类推。这是我的代码:

string dataRead ="";
serialPort1.Write("P.1=2950'r'n"); //Location register (2950)
serialPort1.Write("^.1'r'n"); //Moving command
while (dataRead.Contains("Px.1=2950") == false)
{
   serialPort1.Write("?96.1'r'n"); //Ask for current location
   respond3 = serialPort1.ReadExisting();
   dataRead = string.Concat(dataRead, respond3);
}
//Keep moving to 710 after stop at 2950
serialPort1.Write("P.1=710'r'n"); //Location register (710)
serialPort1.Write("^.1'r'n"); //Moving command

问题是,当我调试我的应用程序时,它被困在while循环中。但如果我打破所有,然后再继续,它就会通过。respond3用于从引擎获得输出。只要得到正确的响应,while循环就会结束。

While循环即使语句为false也不会结束

此代码的问题在于ReadExisting的工作方式。重要的部分是:

根据编码,读取SerialPort对象的流和输入缓冲区中所有立即可用的字节。

强调我的。

当你调试时,IO端口有更多的时间读取数据,所以你会在输入中得到一个长字符串,比如:

"?96.1'r'n?96.1'r'n?96.1'r'n?96.1'r'nPx.1=2950'r'n"

然而,当你不调试代码时,代码运行得更快,你会得到:"?"后面跟着"9"等等。

因此,立即可用的字符串将永远不会与字符串"Px.1=2950"匹配,循环也永远不会停止。

考虑到使用换行符分隔的字符串,您可能想要使用的是ReadLine方法。