2014-02-18 59 views
0

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

除此之外,当我发送数据到该设备并等待响应,我标记标志

bool isReady = false; 

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

而在数据解析方法I该标志设置为真,所以当我收到分组数据时,代码可以跳出这个循环并根据需要继续工作。但在我看来,这不是一个干净/好的方法来做到这一点。有时候会出现问题,如果设备不会发送我需要的数据包,那么程序就永远停留在循环中。

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

谢谢,对不起英文不好。

+0

听起来就像您正在使用DataReceived事件。不要使用它,你没有用处。只需直接调用Read()。 –

回答

0

不要等待无尽的回应。使用前面提到的事件来获取数据。也看到这个其他的SO问题。 SerialPort class and DataReceived event... Getting bytes. Use ReadLine or ReadExisting? Any examples?

+0

等待事件将是处理设备本身调用的问题的很酷的方式。但是当我向设备发送一个请求时如何做到这一点,那么我需要等待响应,并依赖于该响应发送其他请求等?我不能退出方法并等待事件。 – Marduk

+0

通过使用事件,您可以保持响应式应用程序,同时仍然与串行端口进行通信。只需在父类或封装逻辑的类中维护状态(在此实例中最后一个操作/请求是什么)即可。认为事件驱动,而不仅仅是一种方法。通过这种方式,你可以取消等,因为你可以在 – eazynow

+0

中构建该逻辑,你可以发布一些伪代码或者一些文章来向我展示它的样子吗?我不知道这是如何完成事件驱动的,并且仍然保持命令处理的正确顺序。 – Marduk

-1

现在我已经使用下面的代码添加了一个5秒超时:

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

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