C# 读取串行数据

C# 读取串行数据,c#,serial-port,readline,C#,Serial Port,Readline,我用这个砸我的头 我正在为一台验血机编写一个串行应用程序。它按以\r\n结尾的行发送信息 问题是,每隔一次我运行这台机器时,它就会漏掉一些行,或者是重复这些行。我停止并重新启动,然后数据正常通过 Im使用DataReceived事件: try { this.the = thePort.ReadLine(); } catch (TimeoutException ex) {} 我完全搞不懂为什么有时它会漏掉第一行,即S1,表示通信已经开始,同时它会在这之后复制数据 我可以通过将读取的每一行

我用这个砸我的头

我正在为一台验血机编写一个串行应用程序。它按以
\r\n
结尾的行发送信息

问题是,每隔一次我运行这台机器时,它就会漏掉一些行,或者是重复这些行。我停止并重新启动,然后数据正常通过

Im使用DataReceived事件:

try
{
    this.the = thePort.ReadLine();
}
catch (TimeoutException ex) {}
我完全搞不懂为什么有时它会漏掉第一行,即S1,表示通信已经开始,同时它会在这之后复制数据


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

由于每次都覆盖this.the,因此您将获得一个竞赛条件。这些事件发生的顺序稍有偏差,或者距离太近,应用程序无法应对。考虑使用一种线程安全的方法,将数据添加到缓冲器或StrugBu建器中,并在其周围进行一些并发保护。

每次使用串行端口发送数据后,您是否正确地处理了端口,不能保证在一次读取中有整个数据,你必须不断地读取数据。有成百上千个正确读取串行数据的例子。您应该将所有字节放在一起,而不是每次接收数据时都替换数据。我的意思是如何使其线程安全的示例?我明白你的意思了,试着为你读的每一行使用一个事件来更新你的控制台,而不是使用一个被覆盖的变量。一个简单的测试是使用Console.WriteLine直接写出thePort.ReadLine()输出。好的,谢谢,我知道发生了什么。我知道我是如何替换变量的内容的,有时数据来得太快了……但是为什么数据来得比其他数据来得快呢?当然,每次都应该是相同的速率。不要依赖于异步事件具有严格的时间顺序或规律性。通信本身可能会波动,Windows消息循环可能在茶歇时间等。许多移动部件。我喜欢使用并发缓冲区(stringbuilder或字节)的想法。如果要使用事件处理程序,请将readline更改为readexisting,这样处理程序就不会被阻止。