打印
[应用相关]

usb实现两个com口

[复制链接]
楼主: dkill
手机看帖
扫描二维码
随时随地手机跟帖
21
simon21ic| | 2008-7-2 12:59 | 只看该作者 回帖奖励 |倒序浏览

应该是你什么地方改错了吧

如果描述符长度出错,温都死可能蓝屏的

使用特权

评论回复
22
dkill|  楼主 | 2008-7-2 13:21 | 只看该作者

描述符长度 您只的是?

我把我改的全贴出来
  const u8 Virtual_Com_Port_ConfigDescriptor[] =
  {
    /*Configuation Descriptor*/
    0x09,   /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,      /* bDescriptorType: Configuration */
    VIRTUAL_COM_PORT_SIZ_CONFIG_DESC,       /* wTotalLength:no of returned bytes */
    0x00,
    0x04,   /* bNumInterfaces: 2 interface */
    0x01,   /* bConfigurationValue: Configuration value */
    0x00,   /* iConfiguration: Index of string descriptor describing the configuration */
    0x80,   /* bmAttributes: self powered */
    0x50,   /* MaxPower 0 mA */
    /*Interface Descriptor*/
    0x09,   /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
    /* Interface descriptor type */
    0x00,   /* bInterfaceNumber: Number of Interface */
    0x00,   /* bAlternateSetting: Alternate setting */
    0x01,   /* bNumEndpoints: One endpoints used */
    0x02,   /* bInterfaceClass: Communication Interface Class */
    0x02,   /* bInterfaceSubClass: Abstract Control Model */
    0x01,   /* bInterfaceProtocol: Common AT commands */
    0x00,   /* iInterface: */
    /*Header Functional Descriptor*/
    0x05,   /* bLength: Endpoint Descriptor size */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x00,   /* bDescriptorSubtype: Header Func Desc */
    0x10,   /* bcdCDC: spec release number */
    0x01,
    /*Call Managment Functional Descriptor*/
    0x05,   /* bFunctionLength */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x01,   /* bDescriptorSubtype: Call Management Func Desc */
    0x00,   /* bmCapabilities: D0+D1 */
    0x01,   /* bDataInterface: 1 */
    /*ACM Functional Descriptor*/
    0x04,   /* bFunctionLength */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
    0x02,   /* bmCapabilities */
    /*Union Functional Descriptor*/
    0x05,   /* bFunctionLength */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x06,   /* bDescriptorSubtype: Union func desc */
    0x00,   /* bMasterInterface: Communication class interface */
    0x01,   /* bSlaveInterface0: Data Class Interface */
   /*Endpoint 2 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    0x82,   /* bEndpointAddress: (IN2) */
    0x03,   /* bmAttributes: Interrupt */
    VIRTUAL_COM_PORT_INT_SIZE,      /* wMaxPacketSize: */
    0x00,
    0xFF,   /* bInterval: */
    /*Data class interface descriptor*/
    0x09,   /* bLength: Endpoint Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */
    0x01,   /* bInterfaceNumber: Number of Interface */
    0x00,   /* bAlternateSetting: Alternate setting */
    0x02,   /* bNumEndpoints: Two endpoints used */
    0x0A,   /* bInterfaceClass: CDC */
    0x00,   /* bInterfaceSubClass: */
    0x00,   /* bInterfaceProtocol: */
    0x00,   /* iInterface: */
  /*Endpoint 3 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    0x03,   /* bEndpointAddress: (OUT3) */
    0x02,   /* bmAttributes: Bulk */
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
    0x00,
    0x00,   /* bInterval: ignore for Bulk transfer */
    /*Endpoint 1 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    0x81,   /* bEndpointAddress: (IN1) */
    0x02,   /* bmAttributes: Bulk */
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
    0x00,
    0x00,    /* bInterval */
          // /*Interface Descriptor*/
    0x09,   /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
    /* Interface descriptor type */
    0x02,   /* bInterfaceNumber: Number of Interface */
    0x00,   /* bAlternateSetting: Alternate setting */
    0x01,   /* bNumEndpoints: One endpoints used */
    0x02,   /* bInterfaceClass: Communication Interface Class */
    0x02,   /* bInterfaceSubClass: Abstract Control Model */
    0x01,   /* bInterfaceProtocol: Common AT commands */
    0x00,   /* iInterface: */
    /*Header Functional Descriptor*/
    0x05,   /* bLength: Endpoint Descriptor size */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x00,   /* bDescriptorSubtype: Header Func Desc */
    0x10,   /* bcdCDC: spec release number */
    0x01,
    /*Call Managment Functional Descriptor*/
    0x05,   /* bFunctionLength */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x01,   /* bDescriptorSubtype: Call Management Func Desc */
    0x00,   /* bmCapabilities: D0+D1 */
    0x01,   /* bDataInterface: 1 */
    /*ACM Functional Descriptor*/
    0x04,   /* bFunctionLength */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
    0x02,   /* bmCapabilities */
    /*Union Functional Descriptor*/
    0x05,   /* bFunctionLength */
    0x24,   /* bDescriptorType: CS_INTERFACE */
    0x06,   /* bDescriptorSubtype: Union func desc */
    0x00,   /* bMasterInterface: Communication class interface */
    0x01,   /* bSlaveInterface0: Data Class Interface */
   /*Endpoint 4 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    0x84,   /* bEndpointAddress: (IN2) */
    0x03,   /* bmAttributes: Interrupt */
    VIRTUAL_COM_PORT_INT_SIZE,      /* wMaxPacketSize: */
    0x00,
    0xFF,   /* bInterval: */
    /*Data class interface descriptor*/
    0x09,   /* bLength: Endpoint Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */
    0x03,   /* bInterfaceNumber: Number of Interface */
    0x00,   /* bAlternateSetting: Alternate setting */
    0x02,   /* bNumEndpoints: Two endpoints used */
    0x0A,   /* bInterfaceClass: CDC */
    0x00,   /* bInterfaceSubClass: */
    0x00,   /* bInterfaceProtocol: */
    0x00,   /* iInterface: */
  /*Endpoint 5 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    0x05,   /* bEndpointAddress: (OUT3) */
    0x02,   /* bmAttributes: Bulk */
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
    0x00,
    0x00,   /* bInterval: ignore for Bulk transfer */
    /*Endpoint 6 Descriptor*/
    0x07,   /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
    0x86,   /* bEndpointAddress: (IN1) */
    0x02,   /* bmAttributes: Bulk */
    VIRTUAL_COM_PORT_DATA_SIZE,             /* wMaxPacketSize: */
    0x00,
    0x00    /* bInterval */
   };
楼上还有各位看看  哪里不对


相关定义
  #define USB_DEVICE_DESCRIPTOR_TYPE              0x01
#define USB_CONFIGURATION_DESCRIPTOR_TYPE       0x02
#define USB_STRING_DESCRIPTOR_TYPE              0x03
#define USB_INTERFACE_DESCRIPTOR_TYPE           0x04
#define USB_ENDPOINT_DESCRIPTOR_TYPE            0x05

#define VIRTUAL_COM_PORT_DATA_SIZE              64
#define VIRTUAL_COM_PORT_INT_SIZE               8

#define VIRTUAL_COM_PORT_SIZ_DEVICE_DESC        18
#define VIRTUAL_COM_PORT_SIZ_CONFIG_DESC        125//67+37
#define VIRTUAL_COM_PORT_SIZ_STRING_LANGID      4
#define VIRTUAL_COM_PORT_SIZ_STRING_VENDOR      38
#define VIRTUAL_COM_PORT_SIZ_STRING_PRODUCT     50
#define VIRTUAL_COM_PORT_SIZ_STRING_SERIAL      22

#define STANDARD_ENDPOINT_DESC_SIZE             0x09

使用特权

评论回复
23
dkill|  楼主 | 2008-7-2 14:00 | 只看该作者

问题没解决 怎么可以沉下去

使用特权

评论回复
24
simon21ic| | 2008-7-2 14:08 | 只看该作者

建议先看一下CDC的协议

能否通过这个类实现多个接口?
如果CDC没有现成的驱动可用的话,建议使用HID类,毕竟Windows提供了不少的HID的API
当然,如果都需要自己写驱动了,协议就不成问题了,自己定义都可以

使用特权

评论回复
25
dkill|  楼主 | 2008-7-2 14:34 | 只看该作者

hid怎么实现呢

simon21ic  我怎么能和你联系  可以向您请教吗

使用特权

评论回复
26
simon21ic| | 2008-7-2 14:46 | 只看该作者

hehe,我没做过在PC上实现多个串口

只是建议而已,建议你先确定实现方法,再动手

可以看一下STM32的HID示例,HID类的好处就是可以设置多个不同的ID,这个很容易区分是哪个串口(比如,HID实现键盘和鼠标在一起的设备,就可以通过不同的ID来判断是键盘的消息还是鼠标的消息)

使用特权

评论回复
27
香水城| | 2008-7-2 14:50 | 只看该作者

楼主最好先把路探清楚,看看有没有路,路在哪里

有可能你的问题没有现成的答案,需要自己开路。

使用特权

评论回复
28
dkill|  楼主 | 2008-7-2 15:05 | 只看该作者

好像这个路真的还没人走过

使用特权

评论回复
29
computer00| | 2008-7-2 16:33 | 只看该作者

这个路肯定是有人走过的~~~至少我知道有人用网口实现过多

至于USB口的,应该也有吧……

如果你会WDM驱动开发的话,自己写个驱动不难,而且还用不了那么多的端点……
如果你直接用CDC类,一个COM口应该就需要3个端点……

也许你只需要有2个union_functional_descriptor就够了……而共用一个CDC接口?这样在配置描述符中设置3个接口。
这个你需要看看USB的CDC协议。我当初这个USB转串口,也是看CDC协议做出来的。

描述符大概象下面这个样子试试,仅供参考,蓝屏不负责。

//union_functional_descriptor
{
 sizeof(UNION_FUNCTIONAL_DESCRIPTOR),        //Size of this descriptor in bytes
 CS_INTERFACE_DESCRIPTOR,                  //CS_INTERFACE descriptor type 
 0x06,                                   //Union functional descriptor SubType
 0x00,                                   //MasterInterface,CDC接口
 0x01                                    //SlaveInterface,数据接口
},

//endpoint1in_descriptor
{                                                                //中断输入端点描述
 sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
 ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
 POINT_1_IN,                                                     //端点号,输入端点1
 ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
 SWAP16(0x0010),                                                 //该端点支持的最大包尺寸,16字节
 0x01                                                            //中断扫描时间:设置为1ms
},

//interface_descritor                                             //数据接口描述符
{
 sizeof(INTERFACE_DESCRIPTOR_STRUCT),                             //接口描述符的字节数大小
 INTERFACE_DESCRIPTOR,                                            //接口描述符类型编号
 0x01,                                                            //接口编号为1
 0x00,                                                            //该接口描述符的备用编号
 0x02,                                                            //端点数量为2,使用主端点输入和输出
 0x0A,                                                            //所使用的类,Data Interface Class
 0x00,                                                            //使用的子类
 0x00,                                                            //使用的协议,Common AT commands
 0x00                                                             //接口描述符字符串索引
},
//endpoint2in_descriptor
 {                                                                //主端点输入描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  POINT_2_IN,                                                  //端点号,主输入端点
  ENDPOINT_TYPE_BULK,                                             //使用的传输类型:批量传输
  SWAP16(0x0040),                                                 //该端点支持的最大包尺寸,64字节
  0x0A                                                            //中断扫描时间:批量端点无效
 },

 {                                                                //主端点输出描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  POINT_2_OUT,                                                 //端点号,主输出端点
  ENDPOINT_TYPE_BULK,                                             //使用的传输类型:批量传输
  SWAP16(0x0040),                                                 //该端点支持的最大包尺寸,64字节
  0x0A                                                            //中断扫描时间:批量端点无效
 }

//第二个union_functional_descriptor
//union_functional_descriptor
{
 sizeof(UNION_FUNCTIONAL_DESCRIPTOR),        //Size of this descriptor in bytes
 CS_INTERFACE_DESCRIPTOR,                  //CS_INTERFACE descriptor type 
 0x06,                                   //Union functional descriptor SubType
 0x00,                                   //MasterInterface,CDC接口
 0x02                                    //SlaveInterface,数据接口
},

//endpoint1in_descriptor
{                                                                //中断输入端点描述
 sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
 ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
 POINT_3_IN,                                                     //端点号,输入端点1
 ENDPOINT_TYPE_INTERRUPT,                                        //使用的传输类型:中断传输
 SWAP16(0x0010),                                                 //该端点支持的最大包尺寸,16字节
 0x01                                                            //中断扫描时间:设置为1ms
},

//interface_descritor                                             //数据接口描述符
{
 sizeof(INTERFACE_DESCRIPTOR_STRUCT),                             //接口描述符的字节数大小
 INTERFACE_DESCRIPTOR,                                            //接口描述符类型编号
 0x02,                                                            //接口编号为2
 0x00,                                                            //该接口描述符的备用编号
 0x02,                                                            //端点数量为2,使用主端点输入和输出
 0x0A,                                                            //所使用的类,Data Interface Class
 0x00,                                                            //使用的子类
 0x00,                                                            //使用的协议,Common AT commands
 0x00                                                             //接口描述符字符串索引
},
//endpoint2in_descriptor
 {                                                                //主端点输入描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  POINT_4_IN,                                                  //端点号,主输入端点
  ENDPOINT_TYPE_BULK,                                             //使用的传输类型:批量传输
  SWAP16(0x0040),                                                 //该端点支持的最大包尺寸,64字节
  0x0A                                                            //中断扫描时间:批量端点无效
 },

 {                                                                //主端点输出描述
  sizeof(ENDPOINT_DESCRIPTOR_STRUCT),                             //端点描述符的字节数大小
  ENDPOINT_DESCRIPTOR,                                            //端点描述符类型编号
  POINT_4_OUT,                                                 //端点号,主输出端点
  ENDPOINT_TYPE_BULK,                                             //使用的传输类型:批量传输
  SWAP16(0x0040),                                                 //该端点支持的最大包尺寸,64字节
  0x0A                                                            //中断扫描时间:批量端点无效
 }

使用特权

评论回复
30
dkill|  楼主 | 2008-7-2 16:46 | 只看该作者

说句实话 您给的程序我都不知道怎么移到stm32上

union_functional_descriptor
和配置描述符 有什么关系?

使用特权

评论回复
31
simon21ic| | 2008-7-2 17:09 | 只看该作者

还是建议先看看CDC协议吧

CDC的描述符,还有如下:
Header Functional Descriptor
Call Managment Functional Descriptor
ACM Functional Descriptor
Union Functional Descriptor

这个如果没有现成的实现代码的话,又不愿意看协议的话,估计是做不出来了

使用特权

评论回复
32
jeames| | 2008-7-2 20:13 | 只看该作者

To: dkill

我把NXP的一个例子代码发上来,仅供参考


相关链接:https://bbs.21ic.com/upfiles/img/20078/2007817202916939.rar

使用特权

评论回复
33
jeames| | 2008-7-2 20:14 | 只看该作者

虚拟成两个串口,都可以用

(在PC端的设备管理里可以看到)

使用特权

评论回复
34
simon21ic| | 2008-7-2 20:27 | 只看该作者

看了一下

这个不需要驱动的吗?
并不是使用CDC类或者HID类,应该需要一个驱动的吧

使用特权

评论回复
35
jeames| | 2008-7-2 20:33 | 只看该作者

驱动有呀

我在10楼已经上传了

使用特权

评论回复
36
simon21ic| | 2008-7-2 21:11 | 只看该作者

哦,原来是10楼的后续啊

其实如果完全自己实现驱动的话,描述符的定义到不会太重要,怎么定义都可以
我的意思是如果使用CDC或者HID类,是否实现起来会简单一些,因为有一些API可以条用

使用特权

评论回复
37
dkill|  楼主 | 2008-7-3 13:21 | 只看该作者

对呀 能不能使用cdc 就可以实现的

我把cdc实现一个的驱动发上来   请楼上各位 分析一下
  同时谢谢jeams的支持
; STMicroelectronics Comunication Device Class driver instalation file
; (C)2006 Copyright STMicroelectronics
;

[Version] 
Signature="$Windows NT$" 
Class=Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} 
Provider=%STM% 
LayoutFile=layout.inf
DriverVer=10/02/06

[Manufacturer] 
%STM%=DeviceList

[DestinationDirs] 
DefaultDestDir=12 

[SourceDisksFiles]

[SourceDisksNames]

[DeviceList] 
%DESCRIPTION%=STMUSB, USBVID_0483&PID_5740 

;------------------------------------------------------------------------------
;  Windows 2000/XP Sections
;------------------------------------------------------------------------------

[STMUSB.nt] 
include=mdmcpq.inf
CopyFiles=DriverCopyFiles
AddReg=STMUSB.nt.AddReg 

[DriverCopyFiles]
usbser.sys,,,0x20

[STMUSB.nt.AddReg] 
HKR,,DevLoader,,*ntkern 
HKR,,NTMPDriver,,usbser.sys 
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" 

[STMUSB.nt.Services] 
AddService=usbser, 0x00000002, DriverService


[STMUSB.nt.HW]
include=mdmcpq.inf

[DriverService] 
DisplayName=%DESCRIPTION% 
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%usbser.sys 

;------------------------------------------------------------------------------
;  String Definitions
;------------------------------------------------------------------------------

[Strings] 
STM="STMicroelectronics"
DESCRIPTION="STM32 Virtual COM Port" 

使用特权

评论回复
38
simon21ic| | 2008-7-3 14:18 | 只看该作者

这个只是一个说明性的文件而已

Linux下甚至不需要这类文件
正真的CDC驱动应该是usbser.sys吧

使用特权

评论回复
39
jeames| | 2008-7-3 17:52 | 只看该作者

usbser.sys是windows自带的驱动

虽然使用简单方便,但好像有局限性
没有参考代码,不知道能否支持一个USB设备多个串口



使用特权

评论回复
40
dkill|  楼主 | 2008-7-3 19:08 | 只看该作者

参考代码指的是?

10楼的驱动   安装不上   不知道为什么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则