2013-05-10 52 views
1

我正在用这个抨击我的头。阅读串行数据

我正在为测试血液的机器编写一个串行应用程序。它以线路形式发送信息,以\r\n结尾。

问题是,我每隔一段时间运行机器,都会漏掉一些线条,或者它会复制它们。我停下来重新启动,然后数据正常。

林使用DataReceived事件检索:

try 
{ 
    this.the = thePort.ReadLine(); 
} 
catch (TimeoutException ex) {} 

我,为什么有时候它错过这将是S1说通信已经开始的第一行完全糊涂了,并在同一时间将复制这之后的数据。

我可以通过将每行读取附加到文本框来看到这一点。

+0

您是否正确处理完每次使用后的端口? – 2013-05-10 15:02:58

+0

串行数据发送后,您不能保证在一次读取中拥有整个数据,您必须连续读取数据。有数百个如果不是数千个正确读取串行数据的例子。每次收到数据时,应该将所有字节放在一起而不是替换数据。 – 2013-05-10 15:28:01

回答

3

由于每次都覆盖这个,你会遇到竞争状况。事件发生的顺序略微不合适或太接近,应用程序无法应付。考虑使用一种线程安全的方法来松开你的数据,比如将它添加到一个缓冲区或一个StringBuilder中,并在它周围提供一些并发保护。

+0

任何代码示例?这个东西对我来说是相当新的 – Glen 2013-05-10 15:10:41

+0

我的意思是如何使它线程安全的例子?我明白你的意思了 – Glen 2013-05-10 15:12:15

+0

尝试使用你阅读的每一行事件来更新你的控制台,而不是使用一个被覆盖的变量。一个简单的测试是使用Console.WriteLine直接写出thePort.ReadLine()输出。 – 2013-05-10 15:28:10