c#.NET串行驱动程序性能

c#.NET串行驱动程序性能,c#,C#,我的应用程序需要通过串行通信与时钟频率约为1MHz的嵌入式设备进行通信。在这个过程中,我们发现我们丢失了一些来自设备的数据 因此,我开始测试我使用的串行驱动程序的性能。设备继续发送原始数据,每个数据包的计数器以115200位/秒的波特率增加。当连接到超级终端并运行了一整晚时,我们发现它并没有丢失任何数据 但是当我使用带有DataReceived处理程序和解析器的c#串行驱动程序来查找数据包是否丢失时,我们遇到了如下情况 1) 包丢失 2) 缓冲区溢出错误 我无法得出结论。我想要你对可用数据的所有

我的应用程序需要通过串行通信与时钟频率约为1MHz的嵌入式设备进行通信。在这个过程中,我们发现我们丢失了一些来自设备的数据

因此,我开始测试我使用的串行驱动程序的性能。设备继续发送原始数据,每个数据包的计数器以115200位/秒的波特率增加。当连接到超级终端并运行了一整晚时,我们发现它并没有丢失任何数据

但是当我使用带有DataReceived处理程序和解析器的c#串行驱动程序来查找数据包是否丢失时,我们遇到了如下情况

1) 包丢失 2) 缓冲区溢出错误

我无法得出结论。我想要你对可用数据的所有看法

这是一个扩展任何串行设备驱动程序边界的测试吗?或者.NET串行驱动程序的编写方式不符合标准


我实现的方法非常简单。我刚刚使用了一个DataReceived处理程序并将数据更新为一个列表,inturn由运行在具有最高优先级的不同线程中的解析器使用。DataReceived hanlder中的功能只是将接收到的数据添加到列表中

提前谢谢


我实现的方法非常简单。我刚刚使用了一个DataReceived处理程序并将数据更新为一个列表,inturn由运行在具有最高优先级的不同线程中的解析器使用

这可能是你的问题。解析器很可能是CPU受限的,这意味着将其保持在最高优先级意味着它将消耗绝大多数CPU周期,直到用完要解析的内容为止,因此您的DataReceived线程无法执行,并最终丢失了内容


简而言之,除非你知道自己在做什么,否则不要摆弄优先级。将优先级设置回正常,您将获得更好的结果。

使用
列表在两个线程之间通信是一个坏主意,因为它不是线程安全的(除非您周围有锁,是吗??)。如果您使用的是.NET4,请使用
ConcurrentQueue


此外,正如Anon指出的,高优先级线程很少是正确的答案。在这种情况下,解析器应该,如果有任何东西以低于正常优先级的
运行,因为它的任务只是消耗队列,而不影响可能正在执行I/O的任何其他线程。您可以关注解析器线程中的队列长度,如果它落后得太远,则发出警告。

我怀疑它的波特率是
115200Kbps
,您可能指的是115200bps。“在具有最高优先级的不同线程中运行的解析器”-该线程可能会抢占处理传入串行数据的线程,具体取决于解析器线程如何处理从列表中读取的数据,以及您如何同步ThreadsHanks。当我将所有线程的优先级设置为正常值时,性能提高了很多。我只是想知道有什么方法可以为处理DataHandler的线程设置优先级?在添加或删除数据之前,我正在锁定列表。所以我要确保通信是线程安全的。