【问题标题】:Handling COM serial port communication处理 COM 串口通信
【发布时间】:2014-02-18 21:23:33
【问题描述】:

我正在考虑在我的程序中正确处理串行端口通信的最佳方法。我有一些设备向我发送数据,我使用 DataRecieved 事件和其中的 ReadExisting 方法接收它。它读取的所有内容都放在缓冲区中,当最后一行等于某个字符串时,我开始将其解析为某种数据包。

除此之外,当我向这个设备发送数据并等待响应时,我标记标志

bool isReady = false;

while(!isReady)
    Thread.Sleep(500);

在数据解析方法中,我将此标志设置为 true,因此当我收到数据包数据时,代码可以跳出此循环并根据需要继续工作。但在我看来,这不是一个干净/好的方法。有时会出现问题,如果设备不发送我需要的数据包,那么程序就会永远卡在循环中。

我想知道,你们如何在代码中解决这种情况?

谢谢,抱歉英语不好。

【问题讨论】:

  • 听起来您正在使用 DataReceived 事件。不要使用它,你对它没有用处。直接调用 Read() 即可。

标签: serial-port interrupt-handling


【解决方案1】:

不要只是在无限循环中等待响应。使用前面提到的事件来获取数据。另请参阅this other SO question。 SerialPort class and DataReceived event... Getting bytes. Use ReadLine or ReadExisting? Any examples?

【讨论】:

  • 等待事件是处理设备本身调用的问题的好方法。但是当我向设备发送一个请求时如何做到这一点,然后我需要等待响应,并依赖该响应发送其他请求等?我不能只是退出方法并等待事件。
  • 通过使用事件,您可以维护响应式应用程序,同时仍与串行端口通信。只需在父级或封装逻辑的类中维护状态(此实例中的最后一个操作/请求是什么)。考虑事件驱动,而不仅仅是单一方法。这样您就可以取消等,因为您可以在中构建该逻辑
  • 嗯,你能发布一些伪代码或者一些文章来向我展示它的外观示例吗?我不知道如何做到这一点,事件驱动并仍然保持命令处理的正确顺序。
【解决方案2】:

现在我使用以下代码添加了 5 秒超时:

bool isReady = false;
DateTime timeout = DateTime.Now;
while(!isReady)
{
    Thread.Sleep(500);
    if((DateTime.Now-timeout).TotalMiliseconds >= 5000)
        break;
}

所以当没有收到响应时,它就会跳出这个循环。这解决了我的一个问题,但我仍然想知道其他方法来处理这个问题。如果你们有任何想法,请分享他们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多