我想做一个usb设备的虚拟com口,哪位大哥给点意见?

时间:2021-02-17 04:40:13
如题,我有一个usb设备,在win2000下做好了它的驱动,其实就是2000ddk里面的bulkusb,用着挺好的。
可现在由于某种原因,我要把这个设备做成一个虚拟com口,即可以通过超级终端传输文件等等,该如何下手呀?
或者哪位大哥有这方面的源代码?不胜感谢。谢谢。

15 个解决方案

#1


我也在做这个事情,有资料能不能给我留一份?

#2


有相关的硬件芯片吧

#3


楼上的?硬件芯片是什么意思?我已经有了usb驱动,现在考虑再做一级fdo过滤是不是就可以了?

#4


具体我不是很清楚,但我们有个产品就是USB虚拟的串口,我把这个产品的驱动安装信息贴出来,你看是否有帮助
----------如下--------------
; SERWPL.INF - INF file for USB-to-Serial Device
; Copyright (C) 2001, Prolific Technology Inc.
;
; 03/14/2001
[Manufacturer]
%Pro%=Pro

[Pro]
%DeviceDesc%=ComPort, USB\VID_067B&PID_2303

[SourceDisksNames]
1=%Pro.Disk%,,,

[SourceDisksFiles]
SER9PL.SYS=1,Win98_ME
SERSPL.VXD=1,Win98_ME
SERSPL.INF=1,Win98_ME
SERWPL.INF=1

[SourceDisksFiles.x86]
ser2pl.sys=1,Win2K

[DestinationDirs]
USB2SER.Files.Ext = 11
USB2SER.Files.Inf = 10,INF
DefaultDestDir=12
ComPort.NT.Copy=12

[ComPort_install]
;Windows98_ME

[Version]
Signature="$Windows 95$"
Class=USB
provider=%Pro%

[PreCopySection]
HKR,,NoSetupUI,,1

[ComPort]
CopyFiles=USB2SER.Files.Ext, USB2SER.Files.Inf
AddReg=USB2SER.AddReg

[USB2SER.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,SER9PL.SYS

[USB2SER.Files.Ext]
SER9PL.SYS
SERSPL.VXD

[USB2SER.Files.Inf]
SERWPL.INF
SERSPL.INF

;========================================================================
;
;========================================================================
[ComPort_Install.NTx86]
;Windows2000

[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%Pro%
LayoutFile=layout.inf
DriverVer=01/09/2003,2.0.0.7

[ComPort.NT]
CopyFiles=ComPort.NT.Copy
AddReg=ComPort.NT.AddReg

[ComPort.NT.HW]
AddReg=ComPort.NT.HW.AddReg

[ComPort.NT.Copy]
ser2pl.sys

[ComPort.NT.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,ser2pl.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[ComPort.NT.HW.AddReg]
HKR,,"UpperFilters",0x00010000,"serenum"

[ComPort.NT.Services]
AddService = Ser2pl, 0x00000002, Serial_Service_Inst
AddService = Serenum,,Serenum_Service_Inst

[Serial_Service_Inst]
DisplayName    = %Serial.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_SYSTEM_START (this driver may do detection)
ErrorControl   = 1               ; SERVICE_ERROR_IGNORE
ServiceBinary  = %12%\ser2pl.sys
LoadOrderGroup = Base

[Serenum_Service_Inst]
DisplayName    = %Serenum.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_DEMAND_START
ErrorControl   = 1               ; SERVICE_ERROR_NORMAL
ServiceBinary  = %12%\serenum.sys
LoadOrderGroup = PNP Filter

[Strings]
Pro = "Prolific"
Pro.Disk = "USB-Serial Cable Diskete"
DeviceDesc = "Prolific USB-to-Serial Comm Port"
Serial.SVCDESC   = "Prolific Serial port driver"
Serenum.SVCDESC = "Serenum Filter Driver"

#5


其中的几个SYS文件网络上可以找到,但是没有原码

#6


楼上的非常感谢。看样子该驱动程序应该不是直接用的ddk下的serenum和serial例程吧?我猜应该是经过改编的,对于serial内部的分发例程应该是直接实现的usb功能。不知道是否准确?

#7


帮不上忙了,因为我的工作就是把这个USB口当串口用,底层的我不懂!

#8


但是如果我用他们的sys文件,是不是不能*传播?会不会侵权?

#9


很简单的,你只要创建一个串口,然后把串口的read和write等改为发送urb,合理处理一些串口io就可以了。

#10


你打算做一个USB转232驱动程序?

#11


串口驱动比USB驱动复杂的多,看看Serial就知道了,不是很简单可以完成的

#12


是啊,我现在基本的收发基本没问题了,但是偶尔还总有Bug。哪位大虾以前做过?我们可以交换源代码互相学习一下。
我的mail: parrot@eyou.com

#13


我也想要

#14


//********************************************************
以下内容,由驱动开发网摘录,不代表本人观点,也不针对任何人
//********************************************************

USB转串口驱动程序的原理不会特别复杂,
但真正实现一个可以可靠稳定工作的DRIVER,对于一个程序员来说,工程量相当大(当然也不能和需要很多人年来实现的大型系统相比,也没有必要相比较)
----》原理不复杂是一回事
----》完善一个产品所需要的工程量/工作量又是另一回事

驱动程序拦截47个IOCONTROLCODE和读写数据,
然后逐一传递到USB口,
并等待外部设备回应。
其中一部分需要回传应用层API。
每一个IOCONTROLCODE并非孤立存在,
47个IOCONTROLCODE的中的一部分CODE之间又相互影响,
在编程之前—》需要理清这些CODE的的输入输出参数以及相互关系,
--》若这一部的规划工作若不做好,不管你对内核多熟悉,再往下写程序,结果只有一个
--》程序出现很多问题,却查不出问题所在,最后又不得不回到重新规划的工作中去。

*************************************
*************何苦呢?****************
*************************************

出现类似的问题并不是因为你脑袋瓜太笨
--》要么是你没有软件工程经验,这很平常,谁对每件事的认识都是从无到有
--》要么是老板认为规划统筹工作不值一文,不值得花费那么多时间去规划统筹
--》要么是老板上司催得太急,但你和他沟通不够
--》要么是你和你的老板都太聪明,同时认为单靠脖子上的那颗大脑袋就足可代替大量的规划统筹设计文档!不值得花那么多的时间用在统筹规划和测试上!


为保证这47个CODE传递的正确性,
--》需要在驱动程序内部、驱动程序与USB外部设备之间、驱动程序与应用程序API之间、应用层ACTIVEX控件层次,作大量的单独的以及相关的测试。

慢慢来吧!






#15


嗯,比较困难呢

#1


我也在做这个事情,有资料能不能给我留一份?

#2


有相关的硬件芯片吧

#3


楼上的?硬件芯片是什么意思?我已经有了usb驱动,现在考虑再做一级fdo过滤是不是就可以了?

#4


具体我不是很清楚,但我们有个产品就是USB虚拟的串口,我把这个产品的驱动安装信息贴出来,你看是否有帮助
----------如下--------------
; SERWPL.INF - INF file for USB-to-Serial Device
; Copyright (C) 2001, Prolific Technology Inc.
;
; 03/14/2001
[Manufacturer]
%Pro%=Pro

[Pro]
%DeviceDesc%=ComPort, USB\VID_067B&PID_2303

[SourceDisksNames]
1=%Pro.Disk%,,,

[SourceDisksFiles]
SER9PL.SYS=1,Win98_ME
SERSPL.VXD=1,Win98_ME
SERSPL.INF=1,Win98_ME
SERWPL.INF=1

[SourceDisksFiles.x86]
ser2pl.sys=1,Win2K

[DestinationDirs]
USB2SER.Files.Ext = 11
USB2SER.Files.Inf = 10,INF
DefaultDestDir=12
ComPort.NT.Copy=12

[ComPort_install]
;Windows98_ME

[Version]
Signature="$Windows 95$"
Class=USB
provider=%Pro%

[PreCopySection]
HKR,,NoSetupUI,,1

[ComPort]
CopyFiles=USB2SER.Files.Ext, USB2SER.Files.Inf
AddReg=USB2SER.AddReg

[USB2SER.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,SER9PL.SYS

[USB2SER.Files.Ext]
SER9PL.SYS
SERSPL.VXD

[USB2SER.Files.Inf]
SERWPL.INF
SERSPL.INF

;========================================================================
;
;========================================================================
[ComPort_Install.NTx86]
;Windows2000

[Version]
Signature="$Windows NT$"
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%Pro%
LayoutFile=layout.inf
DriverVer=01/09/2003,2.0.0.7

[ComPort.NT]
CopyFiles=ComPort.NT.Copy
AddReg=ComPort.NT.AddReg

[ComPort.NT.HW]
AddReg=ComPort.NT.HW.AddReg

[ComPort.NT.Copy]
ser2pl.sys

[ComPort.NT.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,ser2pl.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[ComPort.NT.HW.AddReg]
HKR,,"UpperFilters",0x00010000,"serenum"

[ComPort.NT.Services]
AddService = Ser2pl, 0x00000002, Serial_Service_Inst
AddService = Serenum,,Serenum_Service_Inst

[Serial_Service_Inst]
DisplayName    = %Serial.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_SYSTEM_START (this driver may do detection)
ErrorControl   = 1               ; SERVICE_ERROR_IGNORE
ServiceBinary  = %12%\ser2pl.sys
LoadOrderGroup = Base

[Serenum_Service_Inst]
DisplayName    = %Serenum.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_DEMAND_START
ErrorControl   = 1               ; SERVICE_ERROR_NORMAL
ServiceBinary  = %12%\serenum.sys
LoadOrderGroup = PNP Filter

[Strings]
Pro = "Prolific"
Pro.Disk = "USB-Serial Cable Diskete"
DeviceDesc = "Prolific USB-to-Serial Comm Port"
Serial.SVCDESC   = "Prolific Serial port driver"
Serenum.SVCDESC = "Serenum Filter Driver"

#5


其中的几个SYS文件网络上可以找到,但是没有原码

#6


楼上的非常感谢。看样子该驱动程序应该不是直接用的ddk下的serenum和serial例程吧?我猜应该是经过改编的,对于serial内部的分发例程应该是直接实现的usb功能。不知道是否准确?

#7


帮不上忙了,因为我的工作就是把这个USB口当串口用,底层的我不懂!

#8


但是如果我用他们的sys文件,是不是不能*传播?会不会侵权?

#9


很简单的,你只要创建一个串口,然后把串口的read和write等改为发送urb,合理处理一些串口io就可以了。

#10


你打算做一个USB转232驱动程序?

#11


串口驱动比USB驱动复杂的多,看看Serial就知道了,不是很简单可以完成的

#12


是啊,我现在基本的收发基本没问题了,但是偶尔还总有Bug。哪位大虾以前做过?我们可以交换源代码互相学习一下。
我的mail: parrot@eyou.com

#13


我也想要

#14


//********************************************************
以下内容,由驱动开发网摘录,不代表本人观点,也不针对任何人
//********************************************************

USB转串口驱动程序的原理不会特别复杂,
但真正实现一个可以可靠稳定工作的DRIVER,对于一个程序员来说,工程量相当大(当然也不能和需要很多人年来实现的大型系统相比,也没有必要相比较)
----》原理不复杂是一回事
----》完善一个产品所需要的工程量/工作量又是另一回事

驱动程序拦截47个IOCONTROLCODE和读写数据,
然后逐一传递到USB口,
并等待外部设备回应。
其中一部分需要回传应用层API。
每一个IOCONTROLCODE并非孤立存在,
47个IOCONTROLCODE的中的一部分CODE之间又相互影响,
在编程之前—》需要理清这些CODE的的输入输出参数以及相互关系,
--》若这一部的规划工作若不做好,不管你对内核多熟悉,再往下写程序,结果只有一个
--》程序出现很多问题,却查不出问题所在,最后又不得不回到重新规划的工作中去。

*************************************
*************何苦呢?****************
*************************************

出现类似的问题并不是因为你脑袋瓜太笨
--》要么是你没有软件工程经验,这很平常,谁对每件事的认识都是从无到有
--》要么是老板认为规划统筹工作不值一文,不值得花费那么多时间去规划统筹
--》要么是老板上司催得太急,但你和他沟通不够
--》要么是你和你的老板都太聪明,同时认为单靠脖子上的那颗大脑袋就足可代替大量的规划统筹设计文档!不值得花那么多的时间用在统筹规划和测试上!


为保证这47个CODE传递的正确性,
--》需要在驱动程序内部、驱动程序与USB外部设备之间、驱动程序与应用程序API之间、应用层ACTIVEX控件层次,作大量的单独的以及相关的测试。

慢慢来吧!






#15


嗯,比较困难呢