2010-08-19 37 views
0

我的应用程序需要通过串行通信与大约1MHz时钟速度的嵌入式设备进行通信。在这个过程中,我们发现我们错过了设备中的一些数据。c#.NET串行驱动程序性能

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

但是,当我使用DataReceived处理程序和书面找到包是否丢失或不解析器的C#串口驱动程序,我们遇到的情况一样

1)丢失的数据包 2)缓冲超限错误的。

我无法得出结论。我希望获得关于可用数据的全部观点。

它是一个延伸任何串行设备驱动程序边界的测试吗?或者.NET串行驱动程序写入的方式不符合标记?

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

由于提前

+0

我以某种方式怀疑它是'波特率115200 Kbps',你可能意味着115200bps。 – leppie 2010-08-19 05:02:21

+0

“解析器运行在具有最高优先级的不同线程中” - 该线程可能会抢占处理传入串行数据的线程,具体取决于解析器线程如何处理从列表读取以及如何同步线程 – Peter 2010-08-19 05:03:52

回答

2

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

这可能是你的问题。解析器很可能是受CPU限制的,这意味着将它固定在最高优先级上意味着它将消耗绝大多数CPU周期,直到它耗尽了要解析的东西,因此您的DataReceived线程缺乏执行并最终丢失东西。

总之,不会摆弄优先级,除非你知道你在做什么。将优先级设置恢复正​​常,您将获得更好的结果。

+0

谢谢。当我将线程的所有优先级视为正常时,性能提高了很多。 – Kandy16 2010-08-19 10:34:34

+0

我只是想知道如何设置处理DataHandler的线程的优先级? – Kandy16 2010-08-19 10:43:45

0

使用List在两个线程之间进行通信是一个坏主意,因为它不是线程安全的(除非你有锁 - 你是否?)。如果您使用的是.NET4,请使用ConcurrentQueue<T>

此外,正如Anon指出的,高优先级的线程很少是正确的答案。在这种情况下,解析器应该优先执行below normal优先级,因为它的工作就是在不影响任何其他可能正在执行I/O的线程的情况下使用队列。您可以留意解析器线程中的队列长度,并在它离开太远时发出警告。

+0

我在添加或删除数据之前锁定了列表。所以Iam确保沟通是线程安全的。 – Kandy16 2010-08-19 10:35:39