while循环即使语句变为false也不会完成

时间:2015-07-02 00:34:00

标签: c# while-loop serial-port

我正在编写一个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循环就会完成。

1 个答案:

答案 0 :(得分:0)

此代码的问题在于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方法。