确定设备是否连接/断开到RS232端口,而不打开端口 [英] Determine if device is connected/disconnected to RS232 port without opening the port

查看:597
本文介绍了确定设备是否连接/断开到RS232端口,而不打开端口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Im正在使用C ++ Win32应用程序,如果设备已经插入其中一个RS232端口,然后如果已断开连接,我将尝试从本质上自动检测。



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



断开连接检测是我遇到的问题当我扫描连接的设备时,我可以实际发送数据到端口,以确保,如果有一个设备,它是我正在寻找的具体设备,但一旦连接,该端口将已经被其他进程打开,我无法再从侦测线程打开该端口。所以我正在寻找一种方法来打开端口在听模式或类似的东西,所以我可以看看设备是否仍然存在。



我短暂地发现了一些关于观看DSR或DTR线路或某事......但是找不到更多或如何实际做的事情。



有任何建议吗? p>

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

解决方案

在连接的硬件上,当您断开硬件时是否会有调制解调器状态寄存器的变化,但如果有,那么您可以使用 GetCommModemStatus() 功能。



然而,有一个问题,你需要一个文件句柄的COM端口来调用任何API函数,这是排除的文档 CreateFile() 说明:


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


COM端口观看线路状态,而另一个进程已打开端口进行通信。



有办法做到这一点,但它们涉及到一个驱动程序。 SysInternals拥有 Portmon工具,Google搜索会打开一些公司销售软件,用于在应用程序之间共享COM端口访问,但使用标准API无法使用AFAIK同时访问。


I"m working on a C++ Win32 application for which I'm trying to essentially "auto detect" if a device has been plugged into one of the RS232 ports and then if it has been disconnected.

The checking for a connected device is easy enough because my use case allows me to assume that this particular thread will be the first to try to initiate communication with the port. I'm able to scan the available ports every minute or so and once I've found a port with the device on it I flag that port has having a device, close the port, then set an event so that the process that actually will use the device knows it can now connect on that port.

The disconnect detect is where I run into trouble. When I'm scanning for connected devices I can actually send data to the port to be sure that, if there is a device, it's the specific device I'm looking for. But once it's connected, that port will already be open by the other process and I can no longer open that port from the detect thread. So I am looking for a way to either open the port in a "listen mode" or something like that so I can just see if the device is still there.

I briefly came across something about watching the DSR or DTR line or something...but couldn't find any more or how to actually do it.

Any suggestions?

Edit: Looks like I need to clarify a little more... For detecting the disconnect, I cannot send data to the RS232 port in any way. Also, I cannot assume that another application actually has the port open. The device may be physically connected, but without and open connection...but I still can't risk sending data to it. I was hoping there was a way to just check that there was still power on that port or something like that.

解决方案

It depends on the connected hardware whether there will be a change in the modem state registers when you disconnect the hardware, but if there is then you could check the state of for example the CTS or DSR line using the GetCommModemStatus() function.

There is however the problem that you need a file handle to the COM port to call any API function, and this is exclusive as the documentation of CreateFile() states:

The CreateFile function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, the dwShareMode parameter must be zero (exclusive access)

So you can not open the COM port to watch the line state while another process has the port opened for communication.

There are ways to do this, but they involve a driver. SysInternals has the Portmon tool, and a Google search will turn up some companies selling software for sharing COM port access between applications, but AFAIK simultaneous access is impossible using the standard API.

这篇关于确定设备是否连接/断开到RS232端口,而不打开端口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆