【问题标题】:Determine if device is connected/disconnected to RS232 port without opening the port在不打开端口的情况下确定设备是否连接/断开到 RS232 端口
【发布时间】:2012-10-09 20:08:16
【问题描述】:

我正在开发一个 C++ Win32 应用程序,我试图在本质上“自动检测”设备是否已插入其中一个 RS232 端口,然后是否已断开连接。

检查连接的设备很容易,因为我的用例允许我假设这个特定线程将是第一个尝试启动与端口通信的线程。我能够每分钟左右扫描一次可用端口,一旦我找到一个带有设备的端口,我标记该端口有一个设备,关闭端口,然后设置一个事件,以便实际执行的进程使用设备知道它现在可以连接到该端口。

断开连接检测是我遇到麻烦的地方。当我扫描连接的设备时,我实际上可以将数据发送到端口,以确保如果有设备,它就是我正在寻找的特定设备。但是一旦它被连接,那个端口就已经被另一个进程打开了,我不能再从检测线程打开那个端口。所以我正在寻找一种方法以“侦听模式”或类似的方式打开端口,以便我可以查看设备是否仍然存在。

我偶然发现了一些关于观看 DSR 或 DTR 线路或其他内容的事情……但找不到更多内容或实际操作方法。

有什么建议吗?

编辑:看来我需要再澄清一点...为了检测断开连接,我无法以任何方式将数据发送到 RS232 端口 . 另外,我不能假设另一个应用程序实际上打开了端口。该设备可能已物理连接,但没有打开连接......但我仍然不能冒险向它发送数据。我希望有一种方法可以检查该端口是否仍有电源或类似的东西。

【问题讨论】:

    标签: c++ winapi serial-port


    【解决方案1】:

    断开硬件时调制解调器状态寄存器是否会发生变化取决于连接的硬件,但如果有,您可以使用GetCommModemStatus() 函数检查例如 CTS 或 DSR 线路的状态.

    然而,问题是您需要 COM 端口的文件句柄来调用任何 API 函数,这是 CreateFile() 的文档所独有的:

    CreateFile 函数可以创建通信资源的句柄,例如串行端口 COM1。对于通信资源,dwCreationDisposition 参数必须为 OPEN_EXISTING,dwShareMode 参数必须为零(独占访问)

    因此,当另一个进程打开该端口进行通信时,您不能打开 COM 端口来观察线路状态。

    有很多方法可以做到这一点,但它们需要驱动程序。 SysInternals 有Portmon tool,谷歌搜索会发现一些公司销售用于在应用程序之间共享 COM 端口访问的软件,但使用标准 API 不可能同时访问 AFAIK。

    【讨论】:

    • 很好的解释,谢谢。不幸的是,我无法在驱动程序级别访问......但我至少可以获取已经打开的端口的句柄,所以我可以检查。
    • 再想一想...有没有办法尝试连接到如果已经有连接就会失败的端口?这样,如果之前的连接失败,或者只是简单的连接,我知道它仍然存在。
    • 可以,只要尝试打开端口,如果失败,检查GetLastError()的结果。这将告诉您端口是否打开。它不会告诉您设备是否仍处于连接状态。您需要为此进行一些定期数据交换,或者在其他进程中也使用 GetCommModemStatus()。
    【解决方案2】:

    听起来,让那个会发出连接和断开事件通知的进程也将数据中继到另一个进程可能是个好主意。让您的应用分层工作,以便有一个进程控制 RS232 连接并发送您的上层应用事件:已连接、已断开连接、可用数据等。

    【讨论】:

    • 不幸的是,这不是一个选项。实际使用连接的进程必须完全控制连接……说来话长,但这就是它的设计方式。
    • 有什么方法可以将连接包装在自己的类中,以进行监控并提供进程调用的所有功能?
    【解决方案3】:

    我已经完成了这样的应用程序,这并不是一个特定于语言的问题(除非您没有使用您的语言访问串行端口)。

    我首选的解决方案一直是每个端口都有一个线程,根据您的配置,线程保持可从某种控制器访问的状态。

    默认情况是线程每隔几秒钟轮询一次端口,并且在没有答案的情况下假设没有连接设备。一旦设备似乎有响应,请更改状态以表明这是响应。

    我设计了一个具有多个队列的应用程序:一个具有断开连接的线程,一个具有连接但空闲的线程,另一个具有连接和繁忙的线程。控制器在更改状态时在队列之间移动线程。

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多