由于遗留原因,我需要让我的程序能够与有限规格可用的第三方设备通信。这本身并不是一个问题,而且我有一些代码可以在忽略所有串行错误时与它进行对话。
我希望它不会忽略错误 - 但问题是从设备收到的每条消息都会在第一个字节上产生帧错误(由于制造商的一些奇怪的设计决定)。
当设备发送响应时,它似乎在线路上声明一个空格6位时间,然后标记2位时间,然后进入正常成帧状态(1个空间起始位,8个数据位,2个标记)停止位)。或者换句话说:传输的第一个字节似乎使用5位成帧,而每个后续字节使用8位成帧;或者第一个字节实际上是一个非常短暂的中断条件。 (除了这个怪癖之外,消息格式设计得相当精确且毫不含糊。)我假设这是作为某种中断唤醒信号,但我不知道它为什么不使用相同的帧。消息的其余部分,或真正的长于一个字符的休息条件。
不出所料,这会使OS烦恼,当它看到第一个“字节”时会产生帧错误。目前我正在使用基于Windows的程序与该设备通信(但稍后可能会迁移到Linux)。在Windows上,我使用重叠I / O和ReadFileEx
来读取实际数据,使用ClearCommError
来检测错误情况。不幸的是,这意味着我得到了独立于数据报告的帧错误 - 然后将其视为正在读取的整个数据块的错误(通常一次只有8个字节,有时甚至更多)并且我似乎无法真正看到进一步本地化。
(帧错误偶尔也会破坏传入消息中的第二个字节,但幸运的是,在解释此特定消息格式时不会出现任何问题。)
我希望能够确定哪些字节特别导致了帧错误,以便端口处理代码可以将其传递给协议处理代码,并且它可以忽略在重要部分之外发生的错误。信息。但我不想降低性能(这是我怀疑如果我尝试逐字节读取会发生的事情;我不确定这是否会起作用)。
这样做有好办法吗?或者我最好忘记整个想法,完全忽略框架错误?
答案 0 :(得分:0)
我不是百分之百确定这是一个强大的解决方案,但它似乎对我有用。
我已经做到这一点,当它检测到帧错误时,下一次读取只读取一个字节,然后那个(假设没有帧错误)将尽可能多地返回读取。这似乎清除它超过错误并接收以下字节没有问题。 (至少当这些字节本身没有任何框架问题时。我不确定如何测试它们的作用。)
答案 1 :(得分:-1)
大约六个月前,我有一个可屏蔽的框架错误与RTMmouse的起诉。 我用DOS 7.10调试修复了它,但是现在我再次使用它...为什么? 我已经在我的DOS 7.10主要aprtition上安装了WIN95并且转换了我的所有辅助aprtition ...除了我的启动分区。我重新安装Windows后,它的运行状态正好对win95主paritiron.This激活了NMI - 可以屏蔽到不可屏蔽的。如何找到错误。它在引导程序上是正确的[在调用带有CSDPMI服务器的lockdrv.bat后通过鼠标驱动程序进行RTM.EXE重定向时,我有一个断点。
因此,在intiial boot之后 - 我立刻就这样做了:
c取代;调试 -u
我从autoexec.bat
的执行中获得了一堆代码 naply跟踪8位操作数,我可以知道CPU正在通过这个方法给NMI - 不确定这个结构的内存是否存在,但是对于锁定%中的每个%f,来自lockdrv.bat的AX钙化%然后推动AX。然后CPU做了其他事情 - 它推动AX然后将ah设置为零
推p mov啊,00这是被禁用的位 - 保持原始数据位完好无损。这是扁平汇编中的帧eroor --- al调用是在bx之前通过si和dx进行的:
添加[si + dx]; al
好吧,计算机识别调制解调器数据位,但我没有发送或收到[我最后一次用Ralf Browns中断列表和调试了]这真的很有趣。但是这是一个帧错误。我验证了int 14中断错误0C作为帧错误 - win95必须已经生成它,因为它不喜欢我的断点[不应该通过v86不再存在但是却产生了一个NMI - 一个帧错误是一个未成年人仍然和NMI如果CPU没有认识它 - 是可能产生的基本或更简单的NMI之一.NMI意味着不可屏蔽或意味着没有例外。一个例子是一个除法溢出,其绝对答案不能因为IRQ冲突或当两个或多个程序发生冲突时,或者在WIN95中以ral模式尝试使用DOS GUI进行多任务时,中断冲突会导致16位一般保护故障通常发生在真实模式中 - 因为WIN 95不支持DOS实模式共享文件解决方案和文件共享。