我使用PIC18F67J94设计了一个嵌入式系统,并使用了随机VID和PID。然后我使用Zadig为硬件生成了一个USB CDC驱动程序。它使用mdmcpq.inf和usbser.sys。以下是Zadig制作的.inf文件,对供应商名称进行了一些修改
[Strings]
SNMPMOD = "SNMP-Modbus Converter"
VendorName = "ABCD"
SourceName = "ABCD Install Disk"
SNMPMODID = "VID_8474&PID_0005"
DeviceGUID = "{6097438F-67AB-4C8C-A8C5-AF92EE79D3DF}"
Service = "USB COM Port"
[Version]
Signature = "$Windows NT$"
Provider = "ABCD"
Class = Ports
ClassGuid = {4D36E978-E325-11CE-BFC1-08002BE10318}
CatalogFile = ABCD.cat
DriverVer = 04/11/2018, 1.0.0.6
[ControlFlags]
ExcludeFromSelect=*
[Manufacturer]
%VendorName% = DeviceList,NTx86,NTamd64
[DeviceList.NTx86]
%SNMPMOD% = UsbSer_Install, USB%SNMPMODID%
[DeviceList.NTamd64]
%SNMPMOD% = UsbSer_Install, USB%SNMPMODID%
[UsbSer_Install]
include = mdmcpq.inf
CopyFiles = FakeModemCopyFileSection
AddReg = UsbSer_Install.AddReg
AddProperty = UsbSer_AddProperty
[UsbSer_Install.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[UsbSer_Install.Services]
AddService = usbser,0x00000002,UsbSer_Service
[UsbSer_Service]
DisplayName = %Service%
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %12%usbser.sys
LoadOrderGroup = Base
[UsbSer_AddProperty]
GenericDriverInstalled,,,,1
[DestinationDirs]
DefaultDestDir = 12
[SourceDisksNames]
1 = %SourceName%
它创建了一个COM端口,工作正常,但如果我在不关闭COM端口的情况下删除设备,然后重新连接设备,设备管理器会显示要连接的设备及其COM端口号,但使用终端软件无法访问该COM端口。
然后我必须再次删除设备,然后重新连接设备,然后它创建一个有效的com端口。
我也使用过FTDI设备,还有Prolific Technology设备,它们都没有这些问题。
Prolific使用ser2pl.sys,其中FTDI有自己的.sys文件。
我想知道是否有可能在设备断开连接时使窗口以某种方式关闭COM端口。
据我所知,对于在Windows 10之前的Windows版本上使用usbser.sys
的任何设备来说,这都是一个不可避免的问题。(你公布了司机的详细信息,这很好,但我认为在这种情况下这无关紧要。(
您可以使用WinObj程序来检查由usbser.sys
等驱动程序创建的COM端口对象,并且您将看到,在使用它的程序关闭其句柄之前,驱动程序无法销毁COM端口。因此,当设备在旧COM端口关闭之前再次插入时,驱动程序无法创建具有正确名称的COM端口,因为旧对象仍在附近。
当他们重写usbser.sys
时,他们实际上在Windows 10中修复了这个问题,所以你可以升级到Windows 10。如果我没有记错的话,要使COM端口工作,你所要做的就是关闭COM端口旧实例的句柄;你再也不用断开设备的连接了。此外,Windows 10附带了一个名为usbser.inf
的Microsoft驱动程序,因此您不必生成自己的驱动程序。
(顺便说一句,如果你打算将此设备运送给用户,我希望你购买自己的供应商ID。如果用户同时拥有随机供应商ID,则使用随机供应商ID会导致冲突,从而干扰你的设备或其他设备的功能。(