2011-11-15 101 views
0

环境:WinXP; PowerBuilder的11.5(虽然可能不相关的,因为这部分几乎完全是WinAPI的呼叫)COM端口退出工作

我的应用程序打开使用重叠的方法调用写一个COM端口。当应用程序打开时,端口被打开。应用程序始终保持开放状态。

偶尔,即使应用程序仍在发送数据,附加设备也会停止接收数据。该应用程序不会收到错误消息。停止并重新启动应用程序不会解决它。重新启动计算机并不能解决问题。但是,通过超级终端连接修复它。

此特定设备打印条形码标签。该应用程序将打印得很好,然后突然,它不会打印。关闭应用程序;打开并连接超级终端;断开并关闭超级终端;打开应用程序。它再次正常工作......一段时间。 (我与其他设备也有类似的问题,也通过COM端口进行通信,所以我知道它不是设备本身。)

我可以在网上找到的最接近的类似问题是http://www.eggheadcafe.com/microsoft/Windows-XP-Hardware/30829577/com1-not-behaving.aspx,它提到IRQ冲突和没有解决方案。我只能猜测我的问题是相似的。

有谁知道超级终端可能会采取什么措施来解决问题吗?

+1

强劲的指标是你得到的握手错误。当设备需要RTS + CTS或Xon/Xoff时,使用无。 –

+0

这当然是一种可能性。但是有些时候会有这样的工作吗?该应用程序工作了一段时间,然后突然停止。另外,如何在使用CreateFile方法时指定握手方法? http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx –

+0

您可以使用SetCommState() –

回答

0

我使用SetCommState明确设置握手方法和似乎已经解决了这个问题。 PowerBuilder没有位操作数,所以我必须创建一个将DWORD数字转换为'1和'0的字符数组的方法。我创建了一个将字符数组转换回DWORD的相应方法。因此,我使用GetCommState获取当前状态,将标志翻译成数组,然后遍历数组,复制除指定流量控制(DTR控制和RTS控制 - 不确定是否需要两者)的现有值外,我明确地设置为'0',然后将结果数组转换回DWORD并使用SetCommState来应用它。

对于那些研究,请记住,DTR控制和RTS控制是每一个都两位。这些十进制值是:

CONSTANT ULong fDtrControl_Enable = 2^4 
CONSTANT ULong fDtrControl_Handshake = 2^5 
CONSTANT ULong fRtsControl_Enable = 2^12 
CONSTANT ULong fRtsControl_Handshake = 2^13 
CONSTANT ULong fRtsControl_Toggle = fRtsControl_Enable + fRtsControl_Handshake 
+0

好吧,悲伤的表情,事实证明,这不能解决它。这是一个零星的问题,客户显然只有几天的幸运连胜,没有出现。要么它不是握手问题,要么我没有正确设置握手设置。 :( –

0

好了,这是非常晚了,但我已经经历了多个设备上类似的问题,主要是对具有USB /串口驱动程序的USB设备。

,我发现症状是COM端口偶尔关闭所有对自己。我已将此问题追溯到两个潜在问题:

  1. USB/COM驱动程序可能有导致端口关闭的错误。尝试更新驱动程序。对进入电脑的USB线

  2. 电气噪声会导致端口关闭。如果遇到此问题,您可能无法轻松解决问题。

    尝试隔离电气环境,使噪音不会通过USB线进入。

    如果你不能,你可能不得不修改你的应用程序来检测一个封闭的端口,然后执行驱动程序重置,这与拔下USB电缆并重新插入USB电缆是一回事,然后暂停一点确保重置实际需要。