我一直在研究各种第三方库以及.Net中低延迟串行通信的方法。我已经阅读了足够的内容,我现在已经完整了,并且因为各种相互矛盾的意见而在我开始时就知道的情况。
例如,框架中的功能被排除在外,因为一些令人信服的文章指出:“微软提供的解决方案在框架版本中并不稳定,缺乏功能。”
我发现了许多基于COM的旧库的文章。由于垃圾收集,我发现文章抨击了低延迟.Net应用程序的概念。
我还阅读了一些文章,这些文章演示了如何为低延迟通信而调用P /调用Windows API功能是不可接受的。
这个规则只关于我能想到的任何方法!
我真的很感激那些经历过那些经历的人所说的话。理想情况下,我可以找到一个可靠的库/合作伙伴,而不必自己构建通信库。我有以下简单的目标:
任何评论,想法,想法或链接到可能解决我的困惑的文章都非常感谢!
答案 0 :(得分:4)
延迟在现代机器上不是问题。串口很慢,19.2千波是花生,.NET SerialPort类处理它们很好。 DataReceived事件由一个线程池线程异步传递,该线程池使用WaitCommEvent()执行阻塞等待,你不能比这更快。
答案 1 :(得分:2)
我有一个.NET应用程序,它运行在一个带有16个COM端口的服务器上,其中大约11个当前连接到各种设备,一些RS485,许多RS-232。 (图中:http://blog.abodit.com/2010/03/home-automation-block-diagram/)。大多数这些设备只运行9600波特,大多数设备的时序要求不是很严格。我有一个处理接收的设备的线程,当它以正常的线程优先级运行时,所有其他非通信线程以较低的优先级运行(无论如何你应该为大多数后台任务执行)。我对此设置没有任何问题。而且,BTW它还使用来自托管代码和1秒DSound缓冲区的高优先级线程同时在三张声卡上播放音乐,所有这些都没有毛刺。
那么您的延迟要求有多紧,波特率和您尝试服务的串口数是多少? UART上的缓冲区在大多数正常波特率下对垃圾收集来说已经绰绰有余了,而且延迟了下一个字节的延迟。
GC并不像它那样邪恶。在适当优先级的线程系统上,具有良好的对象大小和生命周期管理以及足够的缓冲(UARTS / Sound缓冲等),它可以很好地执行。 Microsoft也在不断改进它,.NET Framework 4现在提供后台垃圾收集。此功能取代了以前版本中的并发垃圾回收,并提供了更好的性能。见MSDN。答案 2 :(得分:1)
对于您描述的应用程序类型,.NET通常是一个糟糕的选择。这种事情需要本机代码和C ++之类的语言,至少需要低延迟的部分。
答案 3 :(得分:0)
我个人喜欢我的BBUSB界面。当切换到bitbang模式时,它允许您直接打开/关闭控制8个引脚,您可以将其设置为输入或输出。
“但我需要一个串口。”你说。这完全有可能。只需将引脚连接到9针公头串口,就可以了。
答案 4 :(得分:0)
.Net串行端口类在以高频率发送接收小数据包时消耗太多CPU。它似乎也错过了一些事件。由于我需要能够可靠地发送和接收1000个字节的数据包,因此我总结了一些基于Windows API的东西,现在可以轻松地每秒发送1000个小数据包,同时消耗无CPU。我几乎尝试了所有库中的库,并且这个简单的任务,它们都因CPU利用率过高或错过事件而失败。