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