我正在尝试在Windows(xp)计算机上通过串口实现协议。
问题在于协议中的消息同步是通过消息中的间隙完成的,即,发送字节之间的x毫秒间隙表示新消息。
现在,我不知道是否有可能准确地发现这个差距。
我正在使用win32 / serport.h api来读取我们服务器的众多线程之一。来自串口的数据被缓冲,所以如果我们的软件中有足够的(并且会有足够的)延迟,我将在一个读取序列中从端口缓冲区获得多条消息。
是否有一种从串口读取的方法,以便在收到特定字节时检测到间隙?
答案 0 :(得分:2)
如果您想要更多地控制Windows串行端口,则必须编写自己的驱动程序。
我看到的问题是Windows可能正在执行其他任务或程序(例如病毒检查),这会导致应用程序出现计时问题。您的应用程序将不知道何时换出其他应用程序。
如果可能,我建议你的程序时间标记最后一条消息的结尾。当下一条消息到达时,将采用另一个时间戳。时间戳之间的差异可能有助于检测新消息。
我强烈建议更改协议,以便时间不是一个因素。
答案 1 :(得分:1)
过去我必须做类似的事情。虽然有问题的协议没有使用任何分隔符字节,但它在某些位置确实有一个crc和一些固定值字节,因此我可以推测性地解码该消息以确定它是否是完整的单个消息。
当我遇到这些没有上下文信息的协议时,它总是让我感到惊讶。
查找crc字段,长度字段,具有预期消息长度的相应指示的类型字段或具有可预测值的任何其他固定偏移字段,这些字段可帮助您确定何时有完整的消息。
另一种方法可能是使用CreateFile,ReadFile和WriteFile API函数。您可以使用SetCommTimeouts功能更改设置,该功能允许您在遇到特定时间间隔时暂停I / O操作。
这样做以及一些推测性解码可能是你最好的选择。
答案 2 :(得分:0)
没有任何数据格式描述来自设备的“消息”,这听起来很奇怪。我使用的每个串口设备都有某种形式的标题,描述了它传输的数据。
只是抛弃它,但你可以使用Win32异步ReadFileEx()和WriteFileEx()系统调用吗?它们允许您附加回调函数,然后您可以在回调中管理计时器。然而,计时器只会为您提供粗略估计。
如果您需要编写自己的驱动程序,Windows驱动程序工具包中有一个示例,说明如何编写串行端口驱动程序。我无法想象您将能够覆盖Windows串行端口总线驱动程序(直接控制Windows机器上串行端口的驱动程序),但您可能能够编写位于总线顶部的驱动程序驱动程序。
答案 3 :(得分:0)
我是这么认为的。你们都是在网络上长大的,我没有,虽然我出生时就在场。我猜,一个字节是1(SOH)还是2(STX)? IMVEO就足够了。你只需要在盒子外思考。
您将收到message_delimiter,后跟4(作为长度),然后是4个字节的数据。有效消息不那6个字节。
message_delimiter - 1 byte
4 - length - 1 byte
(4 data bytes) - 4 bytes
有效消息
message_delimiter - 1 byte
4 - length - 1 bytes
(4 data bytes) - 4 bytes
message_delimiter - 1 byte