1.字符串描述符相关概念

字符串描述符:首先,字符串描述符就是用字符串描述一个设备的一些属性,毕竟人能看懂的是字符,而不是十六进制,描述的属性包括设备厂商名字、产品名字、产品序列号、各个配置名字、各个接口名字,还有就是由我们用户自己定义的字符串,说白了就是起名字,让人们一看就知道这个设备是什么设备,字符串描述符对于设备来说是可选的

语言ID描述符:给大家明确一点,其实语言ID描述符也是字符串描述符,它比较特殊,是用来告诉主机其他字符串描述符里面的字符串都支持哪国家语言,因为USB标准全球都在用,字符串的显示形式也是各种各样。

主机需要先获取语言ID描述符确定都用哪些编码,才能正确解析后续得到的字符串描述符。再次说明,语言ID描述符和字符串描述符是一起出现的,因为只有确定了用什么语言,才能读懂后面的字符串。

2.语言ID描述符组成、详解、代码

(1)语言ID描述符组成

(2)语言ID描述符详解

1.bLength

描述符长度,这里的长度不确定,有可能会指示主机需要支持多国语言;

2.bDescriptorType

描述符类型,语言ID描述符也是字符串述符,类型为0x03;

3.wLANGID[0]

要支持的语言ID号,从USB_LANGIDs.pdf这个文档中查询,我也没有下载,大家可以去搜索查询,这里截取了一张图,其实我们用的最多就是标红的两种编码

4.wLANGID[n]

有可能会支持多种语言,我们这里先只支持一种,支持U.S English。

(3)语言ID描述符STM32代码

/* USB String Descriptors (optional) */
const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =
{
CUSTOMHID_SIZ_STRING_LANGID,
USB_STRING_DESCRIPTOR_TYPE,
0x09,
0x04
}; /* LangID = 0x0409: U.S. English */

3.字符串描述符索引剖析

我们前面学过设备描述符、配置描述符、接口描述符,里面有各种字符串描述符索引项,大家肯定有疑惑不知道里面设置为多少,为什么厂商字符串索引、产品字符串索引、产品序列号字符串描述符索引规定为1、2、3等等。

在这里给大家解释下,其实索引号0是给语言ID字符串描述符的,主机必须先获取语言ID字符串描述符才能知道是哪国语言。所以设备如果要实现字符串描述符主机请求的响应,就必须先实现语言ID字符串描述符,当主机使用GET_DESCRIPTOR请求字符串描述符并且索引值为0时,设备必须返回语言ID字符串描述符(记住这里是必须)。

其它索引号也是主机规定的,主机请求索引号为1的字符串描述符,主机收到设备返回的字符串以后就认为是对厂商的字符串说明,设备你如果返回其它的字符串就是不按套路出牌,主机就会显示错位,比如会把厂商字符串显示到产品显示那块去。

如果设备不支持厂商字符串描述符、产品字符串描述符、产品序列号字符串描述符、配置字符串描述符、接口字符串描述符,则对应地方索引应该被设置为0,如下图几处地方设置为0即可。

4.字符串描述符组成、详解、代码

(1)字符串描述符组成

(2)字符串描述符详解

1.bLength

描述符长度,这里的长度不确定,因为字符串多长不定;

2.bDescriptorType

描述符类型,字符串描述符类型为0x03;

3.bString

UNICODE编码的字符串

(3)字符串描述符STM32代码

ONE_DESCRIPTOR String_Descriptor[4] =
{
// index = 0;
{(uint8_t*)CustomHID_StringLangID, CUSTOMHID_SIZ_STRING_LANGID},
// index = 1;
{(uint8_t*)CustomHID_StringVendor, CUSTOMHID_SIZ_STRING_VENDOR},
// index = 2;
{(uint8_t*)CustomHID_StringProduct, CUSTOMHID_SIZ_STRING_PRODUCT},
// index = 3;
{(uint8_t*)CustomHID_StringSerial, CUSTOMHID_SIZ_STRING_SERIAL}
}; const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =
{
CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/
// Manufacturer: "STMicroelectronics"
'M', 0, 'y', 0, 'U', 0,'S', 0,'B', 0, '_', 0, 'H', 0,'I',0,'D',0
}; const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =
{
CUSTOMHID_SIZ_STRING_PRODUCT, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'B', 0, 'y', 0, ' ', 0, 'v', 0, 'i', 0, 'e', 0,'w',0,'t',0,'o',0,'o',0,'l',0
};
uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] =
{
CUSTOMHID_SIZ_STRING_SERIAL, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'x', 0, 'x', 0, 'x', 0,'x', 0,'x', 0, 'x', 0, 'x', 0
};

USB协议详解第8讲(USB描述符-字符串和语言ID描述符)的更多相关文章

  1. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  2. linux usb 驱动详解

    linux usb 驱动详解 USB 设备驱动代码通过urb和所有的 USB 设备通讯.urb用 struct urb 结构描述(include/linux/usb.h ). urb 以一种异步的方式 ...

  3. bt协议详解 DHT篇(上)

    bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...

  4. HTTP协议详解以及URL具体访问过程

    1.简介 1.1.HTTP协议是什么? 即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准.从 ...

  5. (转)HTTP 协议详解(基础)

    HTTP 协议详解 作者: 小坦克  来源: 博客园  发布时间: 2012-02-14 13:32  阅读: 95523 次  推荐: 99   原文链接   [收藏]   相关文章:HTTP 协议 ...

  6. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  7. 【转载】TCP /IP协议详解

    首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...

  8. DNS协议详解

    DNS协议详解 简介 DNS(Domain Name System)域名系统,主要实现的功能是将域名转换成ip地址的一个服务.它是由一个分层的DNS服务器实现的分布式数据库,同时.他也是一个使得主机能 ...

  9. HTTP 协议详解(转载)

    原文: http://kb.cnblogs.com/page/130970/#httpmeessagestructe HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...

  10. Fiddldr 教程之:HTTP协议详解(转)

    原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP ...

随机推荐

  1. 提高 C# 的生产力:C# 13 更新完全指南

    前言 预计在 2024 年 11 月,C# 13 将与 .NET 9 一起正式发布.今年的 C# 更新主要集中在 ref struct 上进行了许多改进,并添加了许多有助于进一步提高生产力的便利功能. ...

  2. 【vue3】详解单向数据流,大家千万不用为了某某而某某了。

    总览 Vue3 的单向数据流 尽信官网,不如那啥. vue的版本一直在不断更新,内部实现方式也是不断的优化,官网也在不断更新. 既然一切皆在不停地发展,那么我们呢?等着官网更新还是有自己的思考? 我觉 ...

  3. 【Layui】05 选项卡 Tabs

    文档位置: https://www.layui.com/doc/element/tab.html 案例演示: <div class="layui-tab"> <u ...

  4. 深度学习的始祖框架,grandfather级别的框架 —— Theano —— 示例代码学习(5)

    代码1:(求雅可比矩阵, jacobian矩阵求解) import theano from theano import tensor # Creating a vector x = tensor.dv ...

  5. 《Python数据可视化之matplotlib实践》 源码 第三篇 演练 第九章

    图  9.1 import matplotlib.pyplot as plt import numpy as np fig=plt.figure() ax=fig.add_subplot(111) f ...

  6. 【转载】 python之理解super及MRO列表

    原文地址:   https://www.jianshu.com/p/de7d38c84443 ----------------------------------------------------- ...

  7. 循环Map的几种方法

    package cn.jdbc.test;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import ...

  8. SMU Summer 2024 Contest Round 5

    SMU Summer 2024 Contest Round 5 Robot Takahashi 思路 按照 \(W_i\) 排个序,算一下前缀后缀 1 和 0 的个数就行了.答案大概是一个 \(\ma ...

  9. Go 互斥锁 Mutex 源码分析 (一)

    0. 前言 锁作为并发编程中的关键一环,是应该要深入掌握的. 1. 锁 1.1 示例 实现锁很简单,示例如下: var global int func main() { var mu sync.Mut ...

  10. Docker容器常用操作命令(镜像的上传、下载、导入、导出、创建、删除、修改、启动等)详解

    1.docker镜像下载 docker pull [options] name [:tag@digest] name后边可以跟镜像标签或者镜像摘要(其实就是镜像的版本),如果不加任何东西,则会默认是在 ...