如何通过串行端口确保两个消息之间的时间段

时间:2012-03-05 12:27:44

标签: c# .net events serial-port buffer

documentation for the Serial Port表示:

  

不保证每个字节都会引发DataReceived事件   接收。使用BytesToRead属性确定数据量   留在缓冲区中读取。

我们尝试实现的协议,按空闲时段分隔消息。由于我们必须依赖每个字符的时间,因此.NET的限制似乎是一个问题。

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

是否可以保证在XY毫秒内至少会引发一个事件?那个最小的时期是什么?如果有的话?

如何解决这个问题?

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

1 个答案:

答案 0 :(得分:2)

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

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