usbser.sys mdmcpq.inf电缆分离问题



我使用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会导致冲突,从而干扰你的设备或其他设备的功能。(

最新更新