确定设备是否已连接/断开RS232端口而不打开端口

时间:2009-04-16 18:56:07

标签: c++ winapi serial-port

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

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

断开连接检测是我遇到麻烦的地方。当我正在扫描连接的设备时,我实际上可以将数据发送到端口,以确保,如果有设备,它就是我正在寻找的特定设备。但是一旦连接,该端口将被其他进程打开,我无法再从检测线程打开该端口。所以我正在寻找一种方法来以“监听模式”或类似的方式打开端口,这样我就能看到设备是否还在那里。

我简单地看到了一些关于观看DSR或DTR线路的事情......但是找不到更多或者如何实际做到这一点。

有什么建议吗?

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

3 个答案:

答案 0 :(得分:4)

取决于连接的硬件,当您断开硬件时,调制解调器状态寄存器是否会发生变化,但是如果有,则可以使用{{3}检查例如CTS或DSR线路的状态功能。

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

  

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

因此,当另一个进程打开端口进行通信时,您无法打开COM端口来监视线路状态。

有很多方法可以做到这一点,但它们涉及到一个驱动程序。 SysInternals有CreateFile(),谷歌搜索会出现一些销售软件的公司,用于在应用程序之间共享COM端口访问,但使用标准API无法同时访问AFAIK。

答案 1 :(得分:1)

听起来这个过程可以提供已连接和断开事件的通知也可以将数据转发给其他进程。让您的应用程序分层工作,以便有一个进程控制RS232连接并发送您的上层应用程序事件:已连接,断开连接,可用数据等。

答案 2 :(得分:0)

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

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

默认情况是线程每几秒轮询一次端口,而没有答案假设没有连接设备。一旦设备似乎响应,请更改状态以指示是这样。

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