【问题标题】:While loop Does not finish even when statement goes falseWhile循环即使语句为假也不会完成
【发布时间】:2015-09-19 08:22:26
【问题描述】:

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

【问题讨论】:

  • readExisting 方法是否每次都读取一个新元素?
  • 是的,我放了一个断点并检查了respond3的值,它记录了所有的消息,包括我正在等待的东西。但它不会退出while循环,直到我在断点处暂停并继续再次运行。
  • 在发送数据后尝试添加类似 thread.sleep 的内容,因为它需要一些时间来响应
  • 您的代码看起来不错。我认为这归结为serialPort1.ReadExisting() 是否返回包含"?96.1\r\n" 的字符串。我们应该如何测试它?
  • 你是对的。这是我在 serialPort1.ReadExisting() 之后放置断点时收到的内容: "?96.1\r\n?96.1\r\n?96.1\r\n?96.1\r\nPx.1=2950\r\n" .您可以看到它在返回正确位置之前多次回复(Px.1=2950)。但我不知道为什么 while-loop 没有完成。

标签: c# while-loop serial-port


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多