我正在为基于串行通信的某种协议开发一些监控工具。
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工作人员: 并且...新胎面(阅读) 并且......总是一样的。太迟了,太慢了。 我是否必须返回WinApi并导入一些kernel32.dll函数?
修订版2: 这是Treading方式中代码使用的一部分:
int c = serialPort1.BytesToRead;
byte[] b = new byte[c];
serialPort1.Read(b, 0, c);
我想这是在SerialPort类中使用流的一些问题。或者一些同步问题。
修订版3: 我不是一次使用两个!!我只是尝试了不同的方式。
此致 MarekK
答案 0 :(得分:1)
也许您应该阅读此first,因为此错误与DataReceived事件有关,该事件有时不会触发,并且在Framework 3.0 / 3.5中仍未修复。此外,你应该阅读关于这张海报的一些here,当他在使用它时遇到问题时向微软报告这个问题,在VS2008 / NET 3.5下...我不知道这是不是真的......但是有些东西值得记住的......微软确实在.NET版本2中引入了一定的难度。
当时,我使用的是.NET 1.1,我遇到了使用VB6 ActiveX控件附带的版本的建议,根据互联网上source的说法,它是最好的串行通信控件!!!
您最好使用第三方代码来处理串行通信,通常是在托管世界之外编写的,即使用大量p / invokes进行管理。
我曾尝试使用在MSDN文章here中找到的John Hind的版本,我确实发现它非常令人反感,因为没有办法异步进行,加上它是一种可怕的编码体验。
我最终使用Franson提供的结果,比Hind的代码效果更好。
希望这有帮助, 最好的祝福, 汤姆。