【问题标题】:COM port quits workingCOM 端口停止工作
【发布时间】:2011-11-15 00:26:37
【问题描述】:

环境:WinXP; PowerBuilder 11.5(虽然可能不相关,因为这部分几乎完全是 WinAPI 调用)

我的应用程序打开一个 COM 端口以使用重叠的方法调用进行写入。打开应用程序时打开端口。该应用程序始终使端口保持打开状态。

有时,即使应用仍在发送数据,连接的设备也会停止接收数据。该应用程序不会收到任何错误消息。停止并重新启动应用程序并不能解决它。重新启动计算机并不能解决它。但是,通过超级终端连接可以解决此问题。

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

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

有谁知道超级终端可能会做些什么来解决问题?

【问题讨论】:

  • 强有力的指标是你的握手错误。就像在设备需要 RTS+CTS 或 Xon/Xoff 时使用 none。
  • 这当然是可能的。但这样的事情在某些时候会起作用吗?该应用程序运行了一段时间,然后突然停止。另外,使用 CreateFile 方法时如何指定握手方法? msdn.microsoft.com/en-us/library/windows/desktop/…
  • 您在 DCB 中使用 SetCommState() 指定它
  • Hans Passant,您能否将其发布为答案,以便我将其标记为已接受?看来指定握手已经解决了这个问题。
  • 请张贴并接受您自己的答案。请提及您更改的 DCB 设置。

标签: winapi serial-port port


【解决方案1】:

我已经使用 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

【讨论】:

  • 好吧,悲伤的脸,事实证明这并没有解决它。这是一个零星的问题,客户显然只是幸运地连续几天没有弹出它。要么不是握手问题,要么我没有正确设置握手设置。 :(
【解决方案2】:

好吧,这已经很晚了,但我在多个设备上都遇到过类似的问题,主要是在具有 USB/COM 端口驱动程序的 USB 设备上。

我发现的症状是 COM 端口偶尔会自行关闭。我已经将此问题追溯到两个潜在问题:

  1. USB/COM 驱动程序可能存在导致端口关闭的错误。尝试更新驱动程序。

  2. 进入计算机的 USB 线上的电噪声会导致端口关闭。如果您遇到此问题,您可能无法轻松解决问题。

    尽量隔离电气环境,以免噪音通过 USB 线进入。

    如果不能,您可能需要修改您的应用程序以检测关闭的端口,然后执行驱动程序重置,这与拔下和重新插入 USB 电缆相同,然后暂停一下以使确保重置确实需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多