我设计了使用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端口。
答案 0 :(得分:1)
据我所知,对于在Windows 10之前的Windows版本上使用usbser.sys
的任何设备,这都是不可避免的问题。(最好张贴有关驱动程序的详细信息,但我没有认为在这种情况下很重要。)
您可以使用WinObj程序检查由usbser.sys
之类的驱动程序创建的COM端口对象,并且您会看到该驱动程序在使用它的程序之前无法销毁该COM端口。关闭它的句柄。因此,在关闭旧的COM端口之前再次插入设备时,驱动程序将无法使用正确的名称创建COM端口,因为旧的对象仍在闲逛。
他们实际上在重写usbser.sys
时已在Windows 10中修复了该问题,因此您可以升级到Windows10。如果我没记错的话,要使COM端口正常工作,您要做的就是关闭句柄。 COM端口的旧实例;您无需断开设备连接。另外,Windows 10附带了一个名为usbser.inf
的Microsoft驱动程序,因此您不必生成自己的驱动程序。
(顺便说一句,如果您打算将此设备运送给用户,我希望您购买自己的供应商ID。使用随机的供应商ID是避免冲突的方法,如果冲突会干扰您的设备或其他设备的功能,用户同时拥有。)