2012-03-05 25 views
0

documentation for the Serial Port指出:如何确保通过串口两条消息之间的时间段

的DataReceived事件检索不能保证提高为每个字节 接收。使用BytesToRead属性来确定剩余数量的数据在缓冲区中被读取。

我们试图实现的协议按空闲周期分隔消息。由于我们必须依赖收到的每个角色的时间,这个.NET的限制似乎是一个问题。

有谁知道.NET的SerialPort如何决定是否引发事件。是否要避免高波特率的垃圾邮件,以便缓冲它们?

是否有任何担保至少会在XY毫秒内引发至少一个事件?那么最短的时间是什么时候?

如何解决这个问题?

编辑:多一点研究表明,它可以通过设置超时完成。愚蠢的我!

+0

只需使用for循环与睡眠呼叫。检查是否有要读取的字节并跟踪计时以获取消息边界检测。尽管使用一些高精度的睡眠。 – CodingBarfield 2012-03-05 13:11:58

回答

2

这不是一个好的协议规划,除非消息之间的时间段至少是几秒钟。 Windows不为用户模式下运行的代码提供任何形式的服务保证,它不是实时操作系统。当机器负载过重并且您的代码被优先级更高的其他线程抢占时,您的代码将失败。像内核线程一样。数百毫秒的延迟是常见的,几秒钟当然是非常可能的,特别是当你的代码被分页并且分页文件被分割时。很难排除故障,重复性很差。

另一种方法很简单,只需在消息周围使用一个框架,以便可以可靠地检测消息的开始和结束。两个字节可以做,STX和ETX是流行的选择。如果消息结束字节也可以出现在数据中,则添加一个长度字节。

相关问题