我试图用5毫秒的间隔将20个字节的数据写入串行端口。为了达到5毫秒,我使用了Windows的多媒体计时器,我还用(winmm.dll)类验证了它的准确性。当计时器过去时,我的应用程序将20字节的数据写入串口。然而,有时(在我看来)数据被缓冲了一段时间,然后发送得太快了。
这个20字节的数据包包含单个CAN消息-8字节数据、4字节ID、CRC、魔术字节和其他一些东西.虽然每条消息之间的延迟应该是5ms,但3-4条消息几乎是在同一时刻一起发送的。我的硬件通过CAN总线发送数据,在CAN总线上定时非常重要,但有时我在CAN总线上同时看到3-4条消息,甚至看不到中间的毫秒。这完全是随机发生的,但是给出一些数字,1000条信息中有5条被发送给fast,其余的都可以。
为了看看这个问题是在软件方面还是在硬件方面,我编写了一个简单的助手应用程序。我安装了com0com并创建了两个虚拟串行端口COM24和COM25。我的主C#应用程序连接COM24,助手应用程序连接到COM25,com0com驱动程序在中间转发所有消息,我用Stopwatch查看帮助程序中消息的时间。在这个场景中不涉及硬件,但仍然是同一个问题,所以我认为它是由Windows引起的。
我试过了
port.Write(data, 0, length);我还试着在将数据写入串口之后进行刷新。
port.BaseStream.Flush();我还尝试异步发送数据,包括/不使用刷新。
port.BaseStream.BeginWrite(data, 0, length, new AsyncCallback((IAsyncResult ar) => {
port.BaseStream.EndWrite(ar);
port.BaseStream.Flush();
}), null);我想知道这个问题是否存在于内核32.dll中,在哪里处理串行端口?Windows内核是否在串口上引入任何延迟等?如何确保数据在port.Write();之后得到真正的刷新
发布于 2022-06-10 21:06:17
期望Windows操作系统在计时方面达到这样高的精度是不合理的。您必须控制UART <-> CAN桥的微控制器中的消息间隔(听起来您在这里有一个自定义的解决方案,您可以重新编程吗?)
特别是,“刷新”仅仅意味着数据被完全传输到内核串口驱动程序。这可能是com0com的虚拟串口、serial.sys、usbser.sys,或者是一些非标准USB/串行设备的虚拟串行驱动程序(例如FTDI或大量使用自定义驱动程序)。这并不意味着它是通过ISA总线(对于“真正的”16550 A串行端口)或USB总线或其他任何东西传输的。即使在传输完成后,发送UART也需要时间来传输20个字节(取决于波特率)。所有这些都是Windows不可见的。
https://stackoverflow.com/questions/72579656
复制相似问题