一点历史:我们有一个应用程序,最初是在很多年前编写的(1998年是PVCS的第一个日期,但是应用程序比它原来的DOS程序大5年左右)。该应用程序通过串行与一块硬件进行通信。当我们进入Windows XP时,我们开始接收应用程序在短时间运行后死亡的报告。似乎串行通信只是'死了'而应用程序处于卡住状态。从这种情况中恢复的唯一方法是重新启动应用程序。
我能找到的关于这个问题的唯一信息显然是Windows消息系统会错过收到的信息,缓冲区会填满,系统会卡住。这段信息留在旧的word文档中,但没有证据支持这一点。它还提到这只在高波特率(115200 +)时才流行。
解决方案是为客户提供USB->串行转换器以及硬件。
今天:我们正在研究将在网络和串行端口上运行的新版硬件。因此,允许我处理网络代码,减去我们使用VSCOM NetCom113设备的实际硬件。它还在用户(即:我的)机器上安装虚拟通信端口。
现在我已经将网络代码与应用程序集成在一起,看起来NetCom设备表现出与物理commport相同的行为。这是不可取的,因为我需要应用程序运行超过~30秒。
谷歌遇到了我们遇到的零问题。
我在想:
不幸的是我无法发布代码,因为序列代码与系统的其他部分紧密相关,但如果您对此有疑问,我可以回答有关它的问题。
更新
答案 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。大多数人没有正确实施该端口。
答案 3 :(得分:0)
不确定这是否可能,但如果您可以使用C#.NET重新编写代码,那么您可以访问SerialPort类。它可能会解决您的问题。我知道很多基于Win32 API的遗留代码因硬件I / O端口因时序而在XP中失败(对MIDI有一点经验)。
此外,我不知道您是否可以在Vista中使用Win32串行端口访问方法,因此可能会阻止未来的MS操作系统无法使用您的代码。