4

我一直在研究各种第三方库和 .Net 中低延迟串行通信的方法。我已经读了足够多的书,现在我已经完成了一个完整的循环,并且由于各种相互矛盾的意见,我知道的和刚开始时一样少。

例如,框架中的功能被排除在外,因为一些令人信服的文章指出:“微软提供的解决方案在框架版本之间并不稳定,并且缺乏功能。”

我发现有文章抨击了许多旧的基于 COM 的库。由于垃圾收集,我发现有文章抨击整个低延迟 .Net 应用程序的想法。

我还阅读了一些文章,这些文章展示了出于低延迟通信目的的 P/Invoking Windows API 功能是不可接受的。

这排除了我能想到的任何方法!

我真的很感激那些去过那里/做过那种经历的人的话。理想情况下,我可以找到一个可靠的库/合作伙伴,而不必自己构建通信库。我有以下简单的目标:

  • C#/VB.Net 中的持续低延迟串行通信
  • 32/64 位
  • 有据可查(如果解决方案是第 3 方)
  • 垃圾收集相对不受影响(通信和延迟方面)。
  • 灵活(我不知道将来要与什么接口!)我唯一确定的要求是我需要能够与许多不同的工业设备接口,例如基于 RS485 的线性执行器、串行/微控制器基于仪表和 ModBus(也是 RS485)设备。

非常感谢任何可能消除我的困惑的评论、想法、想法或文章链接!

4

5 回答 5

3

延迟在现代机器上不是问题。串行端口非常缓慢,19.2 千波特是花生,.NET SerialPort 类可以很好地处理它们。DataReceived 事件由线程池线程异步传递,该线程使用 WaitCommEvent() 执行阻塞等待,您不能比这更快。

于 2010-04-27T03:40:42.590 回答
2

我有一个运行在具有 16 个 COM 端口的服务器上的 .NET 应用程序,其中大约 11 个当前连接到各种设备,一些是 RS485,许多是 RS-232。(此处的图表:http: //blog.abodit.com/2010/03/home-automation-block-diagram/)。这些设备中的大多数仅运行 9600 波特,并且大多数都没有非常严格的时序要求。我每个设备都有一个线程处理接收,虽然它以正常线程优先级运行,但所有其他非通信线程都以较低优先级运行(无论如何你应该为大多数后台任务做)。我对此设置没有任何问题。而且,顺便说一句,它还使用来自托管代码和 1 秒 DSound 缓冲区的高优先级线程同时在三个声卡上播放音乐,所有这些都没有故障。

那么您的延迟要求有多严格,波特率是多少以及您尝试服务多少个串行端口?在大多数正常波特率下,UART 上的缓冲区对于垃圾收集来说已经绰绰有余,而对于延迟从它中取出下一个字节来说则要多得多。

GC 并不像人们想象的那么邪恶。在具有良好管理对象大小和生命周期以及足够缓冲(UARTS/声音缓冲区等)的适当优先级线程系统上,它可以执行得非常好。Microsoft 也在不断改进它,.NET Framework 4 现在提供后台垃圾收集。此功能取代了以前版本中的并发垃圾收集,并提供了更好的性能。请参阅 MSDN。

于 2010-04-27T03:45:47.907 回答
1

对于您描述的那种应用程序,.NET 通常是一个糟糕的选择。这种事情至少在需要低延迟的部分需要本机代码和像 C++ 这样的语言。

于 2010-04-27T03:14:22.890 回答
0

.Net 串行端口类在以高频发送接收小数据包时消耗过多的 CPU。它似乎也错过了一些事件。由于我需要能够可靠地每秒发送和接收 1000 次 16 字节数据包,我最终基于 Windows API 组合了一些东西,现在可以轻松地每秒发送 1000 个小数据包,同时几乎不消耗 CPU。我尝试了几乎所有可用的库,在这个简单的任务中,由于 CPU 利用率过高或错过了事件,它们都失败了。

于 2011-12-17T23:22:28.107 回答
0

我个人喜欢我的BBUSB接口。当切换到 bitbang 模式时,它允许您直接打开/关闭控制 8 个引脚,您可以将其设置为输入或输出。

“但我需要一个串口。” 你说。这是完全可能的。只需将引脚连接到 9 针公头串行端口,您就可以开始使用了。

于 2010-04-27T03:14:10.440 回答