能根据串口驱动来 确定com号
串口:找找程序。
https://msdn.microsoft.com/en-us/library/ff546469%28v=VS.85%29.aspx
根据驱动名称获取串口号不是最好的解决办法,因为一旦换了一台设备,驱动名就不一定了。最好的办法是将串口号写在配置文件,或者数据库中。
追问:
根据硬件的配置,驱动类型是固定的,对应驱动名固定。能获得驱动名,就可以根据驱动名得到分配的COM口,,,写配置文件也行,每次换个usb插口,就要改,嫌麻烦
https://msdn.microsoft.com/en-us/library/ff546469%28v=VS.85%29.aspx
这个是用户态的API啊,不能在内核态使用的,我是想在驱动中得到可用的com。
COM Number好像是在系统分配的。系统在安装COM Port设备的时候,自动生成的。
所以,用系统提供的API可以获取对应的COM Number是否可用。
如果驱动要用,可以考虑写应用程序获取COM Number然后,通过自定义IOCTL告诉驱动。
或者,可以考虑直接去读对应的注册表信息,看看什么端口号还没有用。--但是,这种方式并不保险。
取的时候可能会有重入的问题,如果是写应用程序的话那在驱动中读取就失去了意义了
这个要看LZ拿COM Number做什么用了。一般来说,驱动程序是不需要知道确切的端口号的。
谢谢大家的热心回复了,我确实是要在驱动中拿到确切的端口号,现在我在解决多端口的时候有时会乱码的BUG,我的想发就是直接在驱动初始化的时候先写死,这样的话在任何系统上就不会有端口顺序错乱的问题了
怎么根据设备管理器中的信息取得其对应的串口或驱动器
http://www.myexception.cn/vc-mfc/316257.html
如何根据设备管理器中的信息取得其对应的串口或驱动器?
对于U盘或模拟串口的设备,即用USB线接入这些设备后,会在设备管理器的USB组中出现USB Mass Storage Device或在Ports组中出现USB to Serial Comm Port等,同时系统模拟出了相应的U盘或串口。
问题是:单凭设备管理器中提供的信息,如何编程取得相应的U盘驱动器盘符或串口号?
例
如:插入U盘后,设备管理器出现USB Mass Storage
Device一个条目,同时生出一个U盘,盘符为F。该如何编程实现仅凭设备管理器中的条目就取得其对应的盘符F?不要用扫描盘符的方式,那样会有问题。
因为假如同时插入两个U盘,出来2个盘符,就无法对应区分了。
------解决方案--------------------
获取盘符的PID/.VID等信息,然后跟你设备管理器中的这些信息对比.
------解决方案--------------------
WM_DEVICECHANGE消息会得到插入的硬件产生的一系列设备消息。
从 DEV_BROADCAST_DEVICEINTERFACE::dbcc_name 得到的串可以分析到是那类的设备
如U盘,会前后产生USB、USBSTOR、STORAGE三类设备的消息(需要注册~3个GUID_DEVINTERFACE_*,具体的目前我记不得了)
这三个分别可以对照:
USB - “USB Mass Storage Device”这个东西
USBSTOR - 设备管理器中“磁盘驱动器”节点下显示的你的U盘的型号之类的那个东西
STORAGE - 存储卷,我使用的是已经分配盘符的那种。
win2k3以前的系统 由 STORAGE 的设备实例句柄 调用CM_Get_Parent 可以得到 USBSTOR的,继续调用可以得到 USB 的,再继续调用就是 USBHUB的了。。。(总线关系?)
win vista之后只能根据 STORAGE_DEVICE_NUMBER 结构体的值来找到其“父”设备USBSTOR设备。之后就好办了。
基本上用了很多 SetupDiXXX函数,我试了很久才发现的关系。如果你摸清关系了,我上面说的你应该能明白怎么回事,但说来就话长了。。。
PS:直接从"\\\\.\\X:"也是可以找到他所属的U盘的 设备实例ID什么的的。。。
------解决方案--------------------
这个确实说来话长 ...
1 SetupDiXXX 这套 API 可以找到 各种 Device,获得 DevInst。
2 更据 DevInst 动用 CM_GetParent 之类 寻找 拓扑关系。
3 更据 拓扑树上的节点信息 确认寻找的目标。
发现自己的不足,善于利用找到的方法去扬长避短。行动起来。