C#serialPort速度

我正在为基于串行通信的某种协议开发一些监控工具。

Serial BaudRate = 187,5kb我使用System.IO.Ports.SerialPort类。

该协议有4种帧。 他们有1Byte,3Bytes,6Bytes,10-255Bytes。 我可以和他们一起工作,但我收到他们的时间太迟了

一开始我收到的第一个包装在前。 96毫秒(太晚了),它包含大约1000B。 这意味着20-50帧(太多,太晚了)。 后来它的工作更加稳定,3-10Bytes但是现在还为时已晚,因为它包含1-2帧。 当然1帧是可以的,但2太晚了。

你能指点我怎样才能更可靠地处理它? 我知道这是可能的。

Revision1:

我试了一下:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (!serialPort1.IsOpen) return; this.BeginInvoke(new EventHandler(this.DataReceived)); } 

和Backgroud工作者:并且…新Tread(阅读)和……总是一样的。 太迟了,太慢了。 我是否必须返回WinApi并导入一些kernel32.dll函数?

修订版2:这是Treading方式中代码使用的一部分:

 int c = serialPort1.BytesToRead; byte[] b = new byte[c]; serialPort1.Read(b, 0, c); 

我想这是在SerialPort类中使用流的一些问题。 或者一些同步问题。

修订版3:我不会同时使用这两个! 我只是尝试了不同的方式。

关注MarekK

也许你应该首先阅读这个,因为这个bug与DataReceived Event有关,它有时不会触发,而且在Framework 3.0 / 3.5中仍然没有修复。 此外,你应该在这里阅读一些关于这个海报的内容,当他在使用它时遇到问题时向微软报告这个问题,在VS2008 / NET 3.5下……我不知道这是不是真的……但值得注意的是关于……而且微软确实在.NET版本2中引入了.NET版本。

当时,我使用的是.NET 1.1,我遇到了使用VB6的ActiveX控件附带的版本的建议,根据互联网上的消息来源 ,它是最好的串行通信控制!

您可能最好使用第三方代码来处理串行通信,通常是在托管世界之外编写的,即使用大量p / invokes进行非托管。

我曾尝试使用在这里的MSDN文章中找到的John Hind的版本,我发现它非常令人反感,因为没有办法异步进行,加上它是一种可怕的编码体验。

我最终使用了Franson提供的一个产生比Hind的代码更好的结果。

希望这会有所帮助,最好的问候,汤姆。