当前位置: 首页 > news >正文

android-USB-STM32

usbDevice.getInterfaceCount()

usbDevice.getInterfaceCount() 这个方法返回该USB设备提供的接口(Interface)的数量。
一个USB设备就像一个公司,而接口(Interface) 就像是这个公司里的不同部门。每个部门有自己特定的功能和工作方式。

USB设备有几个接口?

一个USB设备至少有一个接口。

复杂的USB设备(如多功能打印机、集线器)可能有多个接口。

这完全取决于设备的类型和功能。对于你的STM32 CDC设备,答案很典型:通常是 2 个接口。

接口索引接口类型类代码作用比喻

接口 0

 (管理接口)

通信接口

(Control Interface)

USB_CLASS_COMM (2)

管理连接

用于设置波特率、数据位、流控等通信参数。

公司的行政部门。不处理具体业务,只负责制定规则和管理(如:我们公司今天9点上班,用中文沟通)。

接口 1

 (数据接口)

数据接口

(Data Interface)

USB_CLASS_CDC_DATA (10)

传输数据

所有实际要发送和接收的字节数据都通过这个接口。

公司的业务部门。真正干活的部门,按照行政部门定好的规则进行实际工作(如:销售部根据"用中文沟通"的规则去谈客户)

如何用代码找到正确的接口?

在你的Android代码中,你需要遍历所有接口,找到那个真正用于数据传输的数据接口

// 遍历设备的所有接口
for (i in 0 until usbDevice.interfaceCount) {val usbIf = usbDevice.getInterface(i)// 打印接口信息用于调试(非常重要!)Log.d("USB", "接口索引: $i")Log.d("USB", "接口类: ${usbIf.interfaceClass}")Log.d("USB", "接口子类: ${usbIf.interfaceSubclass}")Log.d("USB", "接口协议: ${usbIf.interfaceProtocol}")// 寻找CDC数据接口:类代码为 10 (0x0A)if (usbIf.interfaceClass == UsbConstants.USB_CLASS_CDC_DATA) { // USB_CLASS_CDC_DATA = 10usbInterface = usbIf // 这就是我们要找的"业务部门"!Log.d("USB", "找到数据接口!")break}
}

找到了接口,然后呢?端点是做什么的?

找到了正确的接口(部门)后,还需要找到这个部门里的具体工作人员,这就是端点(Endpoint)

  • 每个接口可以有多个端点

  • 端点是数据通信的最终目的地

  • 端点有方向

  1. UsbConstants.USB_DIR_OUT (0): 输出,主机→设备 (Android→STM32)
  2. UsbConstants.USB_DIR_IN (128): 输入,设备→主机 (STM32→Android)
  • 端点有类型

  1. 批量传输(Bulk Transfer): 用于大量、可靠的数据传输(文件、串行数据)。你的项目就用这种
  2. 中断传输(Interrupt Transfer): 用于频繁、小量、保证延迟的数据(鼠标、键盘)。
  3. 等时传输(Isochronous Transfer): 用于实时数据流(音频、视频),可能丢失数据但保证速度。

在你的STM32 CDC设备的数据接口中,通常有2个端点:

  1. 一个Bulk Out端点(用于Android发送数据给STM32)

  2. 一个Bulk In端点(用于STM32发送数据给Android)

查找端点的代码:

usbInterface?.let { interface ->// 遍历该接口的所有端点for (i in 0 until interface.endpointCount) {val ep = interface.getEndpoint(i)when (ep.direction) {UsbConstants.USB_DIR_OUT -> {// 找到输出端点,用于发送数据给STM32endpointOut = epLog.d("USB", "找到Bulk Out端点: 地址=${ep.address}")}UsbConstants.USB_DIR_IN -> {// 找到输入端点,用于接收来自STM32的数据endpointIn = epLog.d("USB", "找到Bulk In端点: 地址=${ep.address}")}}}
}

http://www.dtcms.com/a/390551.html

相关文章:

  • 云原生周刊:MetalBear 融资、Chaos Mesh 漏洞、Dapr 1.16 与 AI 平台新趋势
  • Android音频学习(十九)——音频HAL层简介
  • Android之音乐列表播放管理类,控制音乐播放、暂停、播放模式的切换等
  • Docker Compose从入门到实战:配置与命令全指南
  • 10.1 输入子系统模型
  • Unity手游输入笔记
  • SpringCloud-注册中心Nacos[笔记3]
  • 关于MySQL与Python后端命令交互备份
  • 大模型上下文工程实践- 上下文管理策略
  • 资产测绘工具-Nmap
  • 智能体环境配置测试
  • 如何将非结构化文档智能解析高质量数据,并按照阅读顺序还原版面?
  • 第八章 惊喜11 认知觉醒
  • 嵌入式系统学习Day37(ARM)
  • 02-Media-10-video_decoder.py 对H.264或H.265格式视频解码并在液晶屏或外接HDMI显示屏上进行显示的示例程序
  • Go面试题及详细答案120题(61-80)
  • 第二部分:VTK核心类详解(第35章:vtkDataSetAttributes数据集属性类)
  • 智能文献分析系统:让AI成为学术研究助手
  • MATLAB基于AHP-熵权法-TOPSIS的学习能力评价研究
  • Ubuntu 部署 PostgreSQL 数据库(附shell脚本一键部署↓)
  • 《数据驱动下的双样本推断:均值与比例的硬核技术实践与方法论思考》
  • Git设置单个仓库用户名和邮箱的方法
  • MongoDB Integer
  • 深度学习第二章 线性代数简介
  • HTB precious
  • 【前后端与数据库交互】从零构建 Python + Vue + MongoDB 网站
  • 对比django,flask,opencv三大
  • 【6/20】MongoDB 入门:连接数据库,实现数据存储与查询
  • 【笔记】Docker使用
  • k8s自定义CNI插件实现指南