2

由于遗留原因,我需要让我的程序能够与可用的有限规格的第三方设备通信。这本身并不是一个真正的问题,当它忽略所有串行错误时,我有一些代码可以很好地与之对话。

不过,我希望它不要忽略错误——但问题是从设备接收到的每条消息都会在第一个字节上产生一个帧错误(由于制造商的一些奇怪的设计决定)。

当设备发送响应时,它似乎在线路上断言一个空格 6 位时间,然后一个标记 2 位时间,然后进入正常帧(1 个空格起始位,8 个数据位,2 个标记停止位) . 或者换一种说法:传输的第一个字节似乎使用 5 位帧,而随后的每个字节都使用 8 位帧;或者第一个字节实际上是一个非常短的中断条件。(除了这个怪癖之外,消息格式设计得相当好并且明确。)我假设这是作为某种中断唤醒信号,虽然我不知道为什么它不使用相同的帧消息的其余部分,或真正的长于一个字符的中断条件。

不出所料,这会惹恼操作系统,当它看到第一个“字节”时会产生帧错误。目前我正在使用基于 Windows 的程序与此设备通信(但可能稍后会迁移到 Linux)。在 Windows 上,我使用重叠 I/OReadFileEx来读取实际数据并ClearCommError检测错误情况。不幸的是,这意味着我得到独立于数据报告的帧错误——然后这被视为正在读取的整个数据块的错误(通常一次 8 个字节,但有时更多),我似乎真的不能进一步本地化。

(帧错误偶尔也会破坏传入消息中的第二个字节,但幸运的是,这不会导致解释此特定消息格式时出现任何问题。)

我希望能够确定哪些字节专门导致了帧错误,以便端口处理代码可以将其传递给协议处理代码,并且它可以忽略消息重要部分之外发生的错误。但我不想降低性能(如果我尝试逐字节读取,我怀疑会发生这种情况;而且我不确定这是否会起作用)。

有没有好的方法来做到这一点?还是我最好忘记整个想法而完全忽略框架错误?

4

2 回答 2

0

我不是 100% 确定这是一个强大的解决方案,但到目前为止它似乎对我有用。

我已经做到了,当它检测到帧错误时,下一次读取将只读取一个字节,然后之后的一个字节(假设仍然没有帧错误)将尽可能多地返回读取。这似乎可以清除错误并毫无问题地接收以下字节。(至少当这些字节本身没有任何框架问题时。我不确定如何测试它们的作用。)

于 2013-03-26T02:23:59.853 回答
-1

大约六个月前,我在使用 RTMmouse 时遇到了一个可屏蔽的框架错误。我已经用 DOS 7.10 调试修复了它,但现在我又得到了它......为什么?我已经在我的 DOS 7.10 主分区上安装了 WIN95 并转换了我所有的辅助分区......除了我的引导分区。我在它的分区上正常​​工作后重新安装了 windows 到 win95 主分区。这激活了 NMI -可以屏蔽到不可屏蔽。我如何找到错误。它就在引导程序上[我有一个断点,在调用 lockdrv.bat 并提供 CSDPMI 服务器后通过鼠标驱动程序进行 RTM.EXE 重定向。

因此,在初始启动后,我立即执行此操作:

C>调试-u

我从执行 autoexec.bat 中生成了一堆代码

准确地跟踪 8 位操作数我可以看到 CPU 正在通过这种方法提供 NMI - 不确定该结构从内存中的准确性,但类似于 lockdrv.bat 的 AX 计算,用于锁定 %% 中的每个 %f

然后是推动 AX。然后 CPU 会执行其他操作 - 它推动 AX,然后将 ah 设置为零

push ax mov ah,00

这是被禁用的位 - 保持 otehr 数据位完整。这是平面组装中的帧 eroor --- 在此之前,al 调用是通过 bx 中的 si 和 dx 进行的:

添加 [si+dx];al

好吧,计算机可以识别调制解调器数据位,但我没有发送或接收[我在最后一晚使用 Ralf Browns 中断列表和调试] 这很有趣。但是这是一个帧错误。我验证了 int 14 错误中断 0C 作为帧错误 - win95 必须生成它,因为它不喜欢我的断点 [通过 v86 不应再存在该断点,但是生成 NMI - 帧错误仍然是次要的,如果 CPU 使用 NMI不承认它 - 是可能导致的基本或更简单的 NMI 之一。NMI 意味着不可屏蔽或意味着没有例外。一个例子是除法溢出,由于 IRQ 冲突或其他中断冲突,它的绝对答案不能偏离,这将形成 16 位一般保护错误,当两个或多个程序冲突时通常在实模式下或在 WIN95 中发生在 ral 模式下尝试使用 DOS GUI 进行多任务 - 因为 WIN 95 不支持 DOS 实模式共享程序进行文件锁定和文件共享。

于 2015-05-25T14:06:24.553 回答