STM32组合设备实现USB转双串口

USB转双串口,核心技术就在于组合设备(USB Composite)的实现,组合设备的实现,其核心技术在于描述符的实现,下面我们先给出描述符:
设备描述符

[C] 纯文本查看 复制代码

?


00001

00002

00003

00004

00005

00006

00007

00008

00009

00010

00011

00012

00013

00014

00015

00016

00017

00018

00019

00020

00021

00022

00023

00024

00025

00026

00027

__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =

  {

    0x12,                       /*bLength */

    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/

    0x00,                       /*bcdUSB */

    0x02,

#ifdef DUAL_COM

    0xEF,                       /*bDeviceClass*/

    0x02,                       /*bDeviceSubClass*/

    0x01,                       /*bDeviceProtocol*/

#else

    0x00,                       /*bDeviceClass*/

    0x00,                       /*bDeviceSubClass*/

    0x00,                       /*bDeviceProtocol*/

#endif

    USB_OTG_MAX_EP0_SIZE,      /*bMaxPacketSize*/

    LOBYTE(USBD_VID),           /*idVendor*/

    HIBYTE(USBD_VID),           /*idVendor*/

    LOBYTE(USBD_PID),           /*idVendor*/

    HIBYTE(USBD_PID),           /*idVendor*/

    0x00,                       /*bcdDevice rel. 2.00*/

    0x02,

    USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/

    USBD_IDX_PRODUCT_STR,       /*Index of product string*/

    USBD_IDX_SERIAL_STR,        /*Index of serial number string*/

    USBD_CFG_MAX_NUM            /*bNumConfigurations*/

  } ; /* USB_DeviceDescriptor */

注意:双串口需要全局定义DUAL_COM宏

配置描述符是重中之重

[C] 纯文本查看 复制代码

?


00001

00002

00003

00004

00005

00006

00007

00008

00009

00010

00011

00012

00013

00014

00015

00016

00017

00018

00019

00020

00021

00022

00023

00024

00025

00026

00027

00028

00029

00030

00031

00032

00033

00034

00035

00036

00037

00038

00039

00040

00041

00042

00043

00044

00045

00046

00047

00048

00049

00050

00051

00052

00053

00054

00055

00056

00057

00058

00059

00060

00061

00062

00063

00064

00065

00066

00067

00068

00069

00070

00071

00072

00073

00074

00075

00076

00077

00078

00079

00080

00081

00082

00083

00084

00085

00086

00087

00088

00089

00090

00091

00092

00093

00094

00095

00096

00097

00098

00099

00100

00101

00102

00103

00104

00105

00106

00107

00108

00109

00110

00111

00112

00113

00114

00115

00116

00117

00118

00119

00120

00121

00122

00123

00124

00125

00126

00127

00128

00129

00130

00131

00132

00133

00134

00135

00136

00137

00138

00139

00140

00141

00142

00143

00144

00145

00146

00147

00148

00149

00150

00151

00152

00153

00154

00155

00156

00157

00158

00159

00160

00161

00162

00163

00164

00165

00166

00167

00168

00169

00170

00171

00172

00173

00174

00175

00176

00177

00178

00179

00180

00181

00182

00183

00184

00185

00186

00187

00188

00189

00190

00191

00192

00193

00194

00195

00196

00197

00198

__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ]  __ALIGN_END =

{

  /*Configuration Descriptor*/

  0x09,   /* bLength: Configuration Descriptor size */

  USB_CONFIGURATION_DESCRIPTOR_TYPE,      /* bDescriptorType: Configuration */

  USB_CDC_CONFIG_DESC_SIZ,                /* wTotalLength:no of returned bytes */

  0x00,

#ifdef DUAL_COM

        0x04,   /* bNumInterfaces: 4 interface */

#else

  0x02,   /* bNumInterfaces: 2 interface */

#endif

  0x01,   /* bConfigurationValue: Configuration value */

  0x00,   /* iConfiguration: Index of string descriptor describing the configuration */

  0x60,   /* bmAttributes: self powered */

  0xFA,   /* MaxPower 0 mA */

  

  /*---------------------------------------------------------------------------*/

#ifdef DUAL_COM

        // IAD

        0x08,        // bLength: Interface Descriptor size

        0x0B,                // bDescriptorType: IAD

        0x00,        // bFirstInterface

        0x02,        // bInterfaceCount

        0x02,        // bFunctionClass: CDC

        0x02,        // bFunctionSubClass

        0x01,        // bFunctionProtocol

        0x02,        // iFunction

#endif

  /*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 Management 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 */

  CDC_CMD_EP,                     /* bEndpointAddress */

  0x03,                           /* bmAttributes: Interrupt */

  LOBYTE(CDC_CMD_PACKET_SZE),     /* wMaxPacketSize: */

  HIBYTE(CDC_CMD_PACKET_SZE),

  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 OUT Descriptor*/

  0x07,   /* bLength: Endpoint Descriptor size */

  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */

  CDC_OUT_EP,                        /* bEndpointAddress */

  0x02,                              /* bmAttributes: Bulk */

  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */

  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),

  0x00,                              /* bInterval: ignore for Bulk transfer */

  

  /*Endpoint IN Descriptor*/

  0x07,   /* bLength: Endpoint Descriptor size */

  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */

  CDC_IN_EP,                         /* bEndpointAddress */

  0x02,                              /* bmAttributes: Bulk */

  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */

  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),

  0x00,                              /* bInterval: ignore for Bulk transfer */

        

#ifdef DUAL_COM

        // IAD

        0x08,        // bLength: Interface Descriptor size

        0x0B,                // bDescriptorType: IAD

        0x02,        // bFirstInterface

        0x02,        // bInterfaceCount

        0x02,        // bFunctionClass: CDC

        0x02,        // bFunctionSubClass

        0x01,        // bFunctionProtocol

        0x02,        // iFunction

  /*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 Management 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 */

  CDC_CMD_EP,                  /* bEndpointAddress */

  0x03,                           /* bmAttributes: Interrupt */

  LOBYTE(CDC_CMD_PACKET_SZE),     /* wMaxPacketSize: */

  HIBYTE(CDC_CMD_PACKET_SZE),

  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 OUT Descriptor*/

  0x07,   /* bLength: Endpoint Descriptor size */

  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */

  CDC_OUT_EP_EX,                     /* bEndpointAddress */

  0x02,                              /* bmAttributes: Bulk */

  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */

  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),

  0x00,                              /* bInterval: ignore for Bulk transfer */

  

  /*Endpoint IN Descriptor*/

  0x07,   /* bLength: Endpoint Descriptor size */

  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */

  CDC_IN_EP_EX,                      /* bEndpointAddress */

  0x02,                              /* bmAttributes: Bulk */

  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */

  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),

  0x00                               /* bInterval: ignore for Bulk transfer */

#endif

} ;

这两个搞定,其他就是USB处理的细节问题了,包括端点的初始化,端点地址分配,数据发送接收的处理等,具体处理和实现程序可参考附件的工程源码。
成功安装驱动
<ignore_js_op> 
设备管理器里面的信息
<ignore_js_op> 
单片机程序源码: <ignore_js_op> Ginkgo_USB_COM.rar (1.06 MB, 下载次数: 2) 
PC端的驱动安装引导程序: <ignore_js_op> two_com.rar (982 Bytes, 下载次数: 2)

转载

时间: 2025-01-05 05:25:28

STM32组合设备实现USB转双串口的相关文章

USB组合设备 Interface Association Descriptor (IAD)

Communication Device Class,简称CDCUSB Compound Device,USB复合设备USB Composite Device,USB组合设备 摘要USB复合设备 Compound Device内嵌Hub和多个Function,每个Function都相当于一个独立的USB外设,有自己的PID/VID.USB组合设备Composite Device内只有一个Function,只有一套PID/VID,通过将不同的interface定义为不同的类来实现多个功能的组合.

【驱动】USB驱动实例&#183;串口驱动&#183;键盘驱动【转】

转自:http://www.cnblogs.com/lcw/p/3159370.html Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_driver结构描述. 对于不同类型的 USB设备,内核使用传统的设备驱动模型建立设备驱动描述,然后映射到 USB设备驱动,最终完成特定类型的 USB设备驱动 USB驱动·入门:http://infohacker.blog.51cto.com/6751239/1226257 USB串口驱动 USB串口驱动关键

第二篇:STM32F103C8T6移植Rt_thread(内置 oled、双串口、shell、AM2302,print 等驱动)

首先打个广告:如果需要做毕设以及嵌入式项目合作,欢迎进入我们工作室:创想嵌入式设计工作室 一边看<扶摇>,一边写博客 ,两不误. 最近在做一个嵌入式开发项目,需要用到双串口,出于实时性考虑,需要实时操作系统,同时基于成本和工作量的要求,最终 敲定的 方案时rt_thread+STM32F103C8T6,之前 从没有在STM32上移植过rt_thread,本想图省事,想着在网上 下载一个DEMO,改改直接用,可是 ,遗憾的是,网上关于移植rt_thread的文章不少 ,但都是浅尝辄止.更是没有居

android设备中USB转串口demo 下载

http://files.cnblogs.com/guobaPlayer/testUSB2Serial.apk USB转串口demo程序, 无需驱动,只要手机USB是OTG类型,插上我们的模块即可使用.当前波特率是9600bps 更多USB转GPIO,按键,PWM,红外,SPI,IIC,ADC,欢迎咨询,洽谈. 杭州蓝松科技,专注于android相关软硬件项目的方案开发工作,欢迎联系:qq1852600324" 公司网站:www.lansongtech.com android设备中USB转串口d

全志Android设备增加Usb host ADK 功能

全志Android设备增加Usb host ADK 功能 Usb Host ADK是指不采用USB驱动,直接用java与设备编程的 这样让Android 可以无需修改内核和驱动情况下方便与各种USB外设通讯.全志的CPU的资料都是公开的,因此我们在上面开发很多应用.但是发现无法使用usb host 接口. 一.测试 可以简单下载USB Device info 来测试 https://play.google.com/store/apps/details?id=aws.apps.usbDeviceE

android设备使用usb串口传输数据

首先介绍两个开源项目一个是Google的开源项目:https://code.google.com/archive/p/android-serialport-api/ 另一个是我们这次介绍的开源项目:https://github.com/mik3y/usb-serial-for-android 第一步:获取所有的已插入的串口驱动 1 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 2 List<Usb

macbook 安装USB转DB9串口驱动

系统版本: 使用的usb转串口数据线的品牌是绿联的,使用其它品牌的也可以试下(应该只要芯片为PL-2303的都可以) 实际上安装很简单,首先要下载驱动,驱动的下载地址如下(我使用的第一个链接下载的): http://www.lulian.cn/download/17-cn.html http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41 下载后将压缩文件解压出来会有个.pkg结尾的文件,双击按照提示安装即可,安装完成会自动重

上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。

用libUSB来实现自己的驱动+下位机理论速度.=1M字节每秒. 达到极限速度 WINDOWS已经自带虚拟串口驱动,只不过还需要一个Inf文件 方法1:直接下载一个串口inf,来修改文件. 方法2:用libUSB来实现自己的驱动...及应用.用那个工具安装成自己定义的设备名字,应用程序就根据PID,VID来找到我们的设备,进行一系列读写.   下位机: 1,配置描述符的编写,见工程代码注释.主要是CDC类接口用端点2,数据接口用端点1和端点3 2,Get_line_coding请求,获取串口属性

普通PC通过USB转485串口 ModBus-RTU通信协议控制伺服电机

一.RS485通信 RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样.RS485 仅仅规定了接收端和发送端的电气特性,并没有规定或推荐任何数据协议 RS485 采用两根通信线,通常用 A 和 B 或者 D+和 D-来表示.逻辑"1"以两线之间的电压差为+(0.2~6)V 表示,逻辑"0"以两线间的电压差为-(0.2~6)V 来表示,是一种典型的差分通信, 电平与