【问题标题】:Serial port WriteFile() freeze串口 WriteFile() 冻结
【发布时间】:2008-10-30 20:16:14
【问题描述】:

我有一个简单的应用程序,它应该每分钟向串行端口发送一个字节。但有时,出于某种奇怪的原因,它会在 WriteFile() 函数的某个位置冻结。 sw 和 hw 流量控制均已关闭。我已经在谷歌上搜索了一些关于从另一个线程执行的挂起读取操作的内容,但我相信这不是问题,因为我的应用程序有单线程。此外,来自 CreateFile 的句柄看起来是有效的,因此该端口不应被任何其他应用程序使用。有人遇到过这种情况吗?

【问题讨论】:

  • 关于语言、平台等的信息也很有帮助。

标签: delphi serial-port freeze writefile


【解决方案1】:

如果你在谷歌上搜索writefile hangs,你会发现很多关于这个问题的讨论。一些线索是缓冲区溢出、正确调整缓冲区大小、COM 端口有缺陷、清除错误状态......似乎有很多事情可以尝试。

我建议的另一件事是使用通信库而不是直接调用 API,例如 Async Professional (http://sourceforge.net/projects/tpapro/)。即使它们为您的应用程序增加了一些开销,它们也可能会简化您的工作并避免许多潜在的陷阱...

【讨论】:

    【解决方案2】:

    好吧,我在 Windows XP 上的 Delphi 7 中使用这个库:http://lhdelphi.ic.cz/uploader/storage/ComDrv32.pas,但里面的组件只是一些 Win API 调用、CreateFile、WriteFile 等的包装器。

    【讨论】:

    • ComDrv32.pas 似乎没有对错误处理进行大量思考。只要事情进展顺利,它就可以正常工作,但对 API 调用没有错误检查。我不相信这个库非常健壮。
    【解决方案3】:

    您是否尝试过将 CommPortDriver.CheckLineStatus 设置为 true(“以防止在未连接设备或设备关闭时挂起”)? comdrv32.pas 库的源代码包含该建议。

    【讨论】:

      【解决方案4】:

      你也可以试试ComPort,它被忽略了一段时间,现在又被积极开发了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多