串行通信在WinXP中死亡

时间:2009-02-19 14:22:43

标签: networking windows-xp serial-port vc6

一点历史:我们有一个应用程序,最初是在很多年前编写的(1998年是PVCS的第一个日期,但是应用程序比它原来的DOS程序大5年左右)。该应用程序通过串行与一块硬件进行通信。当我们进入Windows XP时,我们开始接收应用程序在短时间运行后死亡的报告。似乎串行通信只是'死了'而应用程序处于卡住状态。从这种情况中恢复的唯一方法是重新启动应用程序。

我能找到的关于这个问题的唯一信息显然是Windows消息系统会错过收到的信息,缓冲区会填满,系统会卡住。这段信息留在旧的word文档中,但没有证据支持这一点。它还提到这只在高波特率(115200 +)时才流行。

解决方案是为客户提供USB->串行转换器以及硬件。

今天:我们正在研究将在网络和串行端口上运行的新版硬件。因此,允许我处理网络代码,减去我们使用VSCOM NetCom113设备的实际硬件。它还在用户(即:我的)机器上安装虚拟通信端口。

现在我已经将网络代码与应用程序集成在一起,看起来NetCom设备表现出与物理commport相同的行为。这是不可取的,因为我需要应用程序运行超过~30秒。

谷歌遇到了我们遇到的零问题。

我在想:

  • 以前有没有人经历过这个?如果是这样,你做了什么来修复/解决问题?
  • 有没有人对文件的原作者是否正确以及我可以做些什么来测试理论?

不幸的是我无法发布代码,因为序列代码与系统的其他部分紧密相关,但如果您对此有疑问,我可以回答有关它的问题。

更新

  • 代码是使用Win32 Comm例程编写的 - 所以我使用的是CreateFile,ReadFile。还有对GetOverlappedResult的明智调用。
  • 它本身并没有悬挂,只是通讯停止了。您可以访问菜单,单击按钮,但没有任何东西可以与连接的硬件进行交互。使用realterm,您可以看到没有数据进入或出去。
  • 我认为对windows消息的引用是问题是Windows内部的。数据已经到了,但核心已经错过了,因此没有告诉系统的其余部分。
  • 不使用流量控制。
  • 编写“简单”测试很困难,因为代码紧密耦合,底层协议非常复杂,需要大量工作。

4 个答案:

答案 0 :(得分:2)

您使用的是DOS风格的串行代码还是Win32 CreateFile方法?

如果是前者,请非常怀疑:如果可能的话,我会转换为后者。

如果是后者,你知道它挂在什么样的系统调用上吗?你在禁止看书吗?或重叠的I / O呼叫?或等待活动? (我不确定我是否有足够的经验来帮助,但这些都是我想到的那些问题)

您也可以检查队列大小,您可以使用SetupComm功能设置。

我不买“Windows消息系统”的东西 - 听起来很可疑;你可以写出从不使用Windows消息的好的Win32串行i / o代码。

编辑:您的重叠I / O使用事件?我似乎记得一些关于自动重置事件偶尔会错过触发器的事情......请仔细检查重叠的I / O调用,看看你是否正确处理了可能的结果。也许有一种方法可以通过自动取消重叠的i / o并重新启动另一个读取来使代码更加健壮。 (我假设问题出现在读取的一半,而不是写入的一半?)

编辑2:一个建议:假设win32端丢失了一个字节或数据包,并且你的设备处于死锁状态,因为他们都期望彼此响应某些东西,你能不能调整一下串行I / O的另一端定期发送一些带有递增计数器的“ping”数据包? (并在PC端记录ping数据包;这样你就可以看到你是否错过了任何一个)

答案 1 :(得分:1)

您确定您的流量控制设置正确吗? DTR,RTS等...

- 亚当

答案 2 :(得分:0)

我编写的应用程序使用usb /蓝牙串口,从未遇到过问题。使用蓝牙我已经看到很长一段时间的比特率(持续)为800,000 bps。大多数人没有正确实施该端口。

My serial port

答案 3 :(得分:0)

不确定这是否可能,但如果您可以使用C#.NET重新编写代码,那么您可以访问SerialPort类。它可能会解决您的问题。我知道很多基于Win32 API的遗留代码因硬件I / O端口因时序而在XP中失败(对MIDI有一点经验)。

此外,我不知道您是否可以在Vista中使用Win32串行端口访问方法,因此可能会阻止未来的MS操作系统无法使用您的代码。