由于遗留原因,我需要让我的程序能够与可用的有限规格的第三方设备通信。这本身并不是一个真正的问题,当它忽略所有串行错误时,我有一些代码可以很好地与之对话。
不过,我希望它不要忽略错误——但问题是从设备接收到的每条消息都会在第一个字节上产生一个帧错误(由于制造商的一些奇怪的设计决定)。
当设备发送响应时,它似乎在线路上断言一个空格 6 位时间,然后一个标记 2 位时间,然后进入正常帧(1 个空格起始位,8 个数据位,2 个标记停止位) . 或者换一种说法:传输的第一个字节似乎使用 5 位帧,而随后的每个字节都使用 8 位帧;或者第一个字节实际上是一个非常短的中断条件。(除了这个怪癖之外,消息格式设计得相当好并且明确。)我假设这是作为某种中断唤醒信号,虽然我不知道为什么它不使用相同的帧消息的其余部分,或真正的长于一个字符的中断条件。
不出所料,这会惹恼操作系统,当它看到第一个“字节”时会产生帧错误。目前我正在使用基于 Windows 的程序与此设备通信(但可能稍后会迁移到 Linux)。在 Windows 上,我使用重叠 I/OReadFileEx
来读取实际数据并ClearCommError
检测错误情况。不幸的是,这意味着我得到独立于数据报告的帧错误——然后这被视为正在读取的整个数据块的错误(通常一次 8 个字节,但有时更多),我似乎真的不能进一步本地化。
(帧错误偶尔也会破坏传入消息中的第二个字节,但幸运的是,这不会导致解释此特定消息格式时出现任何问题。)
我希望能够确定哪些字节专门导致了帧错误,以便端口处理代码可以将其传递给协议处理代码,并且它可以忽略消息重要部分之外发生的错误。但我不想降低性能(如果我尝试逐字节读取,我怀疑会发生这种情况;而且我不确定这是否会起作用)。
有没有好的方法来做到这一点?还是我最好忘记整个想法而完全忽略框架错误?