导致.NET SerialPort类DataReceived事件触发的原因是什么?

Kla*_*lay 4 wpf serial-port .net-3.5

我从MSDN文档中了解到事件DataReceived不一定每个字节触发一次.

但有谁知道导致事件发生的机制到底是什么?

在事件触发之前,每个字节的接收是否重新启动一个必须达到的定时器,比如字节之间的10 ms?

我问,因为我正在尝试编写一个应用程序来读取来自串行端口的XML数据.

因为我的笔记本电脑没有串口,我使用的是虚拟串口仿真器.(我知道,我知道 - 我对ATM无能为力).

当我通过模拟端口将数据传递到我的应用程序时,事件会为每个XML记录触发一次(大约1500字节).完善.但是当另一个办公室的同事尝试使用实际电缆连接的两台计算机时,DataReceived事件会在每10个字节的XML之后重复触发,这会完全抛弃应用程序.

Mar*_*ers 6

DataReceived可以在一个或多个字节准备好读取的任何时候触发.它何时被触发取决于操作系统和驱动程序,并且在接收的数据和在.NET中触发的事件之间也会有一个小的延迟.

您不应该依赖DataReceived事件的时间来控制流.

相反,解析基础协议,如果您还没有收到完整的消息,请等待更多.如果您收到多条消息,请确保保留左侧消息以解析第一条消息,因为它们将是下一条消息的开头.

  • 是的,串口数据通常是缓冲的,以提高效率,因此对更新的可预测性很小.我已经完成了类似于Mark描述的操作,设置了一个重复调用ReadExisting的定时器,处理数据中的所有消息,并保存任何半完成的消息.当我使用GPS设备执行此操作时,消息包含校验和,因此您可以验证其完整性和完整性,以确保它没有被切断(在这种情况下,您将在下一个ReadExisting上获取剩余的消息).我在一个包装器中使用它,然后为每个完整的消息触发一个事件. (2认同)