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

USB批量传输数据为端点最大数据包(比如512字节)整数倍时接收端收不到数据

USB 协议明确规定:批量传输中,当发送数据量为端点最大包大小的整数倍时,必须通过 ZLP 标记传输结束。这是应用层需要遵守的协议规范。

USB 协议规定,对于批量传输(Bulk Transfer) 模式:

  • 当发送的数据量小于端点最大包大小(如 511 字节) 时,接收端会默认 “此包为完整数据”(因未填满一包),无需额外标记。
  • 当发送的数据量大于端点最大包大小(如 513 字节) 时,数据会被拆分为多个包(如 512 字节 + 1 字节),接收端通过 “最后一个非满包” 判断传输结束。
  • 当发送的数据量等于端点最大包大小(如 512 字节) 时,接收端无法区分 “这是完整数据” 还是 “后续仍有数据”(因刚好填满一包),此时必须通过零长度包(ZLP) 明确标记 “传输结束”。

解决方案:

比如原来发送数据的代码如下:

private void sendMessage(String msg) {byte[] bytes = msg.getBytes();Log.d(TAG, "mUsbConnection-->msg length: " + bytes.length + ";" + mEndpointOUT.getMaxPacketSize());if (mUsbConnection != null) {int result = mUsbConnection.bulkTransfer(mEndpointOUT, bytes, bytes.length, 100);if (result < 0) {Log.d(TAG, "发送失败");} else {Log.d(TAG, "发送成功" + msg);}} else {Log.d(TAG, "mUsbConnection-->null");}

增加ZLP(零长度数据包)发送代码后接收端即可正常接收512整数倍的数据包了。

private void sendMessage(String msg) {byte[] bytes = msg.getBytes();Log.d(TAG, "mUsbConnection-->msg length: " + bytes.length + ";" + mEndpointOUT.getMaxPacketSize());if (mUsbConnection != null) {int result = mUsbConnection.bulkTransfer(mEndpointOUT, bytes, bytes.length, 100);
        if (bytes.length % 512 == 0) {  // 若正好发送了最大包大小的整数倍,则再发送一个ZLP(零长度包),作为数据包结束标记。result = mUsbConnection.bulkTransfer(mEndpointOUT, new byte[0], 0, 100);}if (result < 0) {Log.d(TAG, "发送失败");} else {Log.d(TAG, "发送成功" + msg);}} else {Log.d(TAG, "mUsbConnection-->null");}
http://www.dtcms.com/a/329026.html

相关文章:

  • Linux系统文件完整性检查工具AIDE在生产环境中推送钉钉告警
  • 音视频处理新纪元:12款AI模型的语音转录和视频理解能力横评
  • MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
  • 前端css学习笔记4:常用样式设置
  • 2025盛夏AI热浪:八大技术浪潮重构数字未来
  • RC4算法实现
  • 前后端分离项目在云服务器的部署
  • java实现sql解析器 JSQLParser
  • 16-docker的容器监控方案-prometheus实战篇
  • 30 HTB Soccer 机器 - 容易
  • 【Android】四种不同类型的ViewHolder的xml布局
  • 双写一致性问题如何解决?
  • Python 元类基础:从理解到应用的深度解析
  • 机器翻译:学习率调度详解
  • 小电视视频内容获取GUI工具
  • 长篇音频制作(小说自动配音)完整教程
  • 嵌入式 - linux软件编程: 目录 IO及时间相关的函数接口
  • 《Python学习之基础语法1:从零开始的编程之旅》
  • Verilog功能模块--SPI主机和从机(02)--SPI主机设计思路与代码解析
  • 电商项目微服务架构拆分实战
  • 使用TexLive与VScode排版论文
  • 内容索引之word转md工具 - markitdown
  • 华为 HCIE 大数据认证中 Linux 命令行的运用及价值
  • 【linux】--U盘挂载
  • 【CV 目标检测】③——目标检测方法
  • 2025_07_安装Jmeter,创建一个登录请求
  • python的游戏评级论坛系统
  • 云计算-OpenStack 实战运维:从组件配置到故障排查(含 RAID、模板、存储管理,网络、存储、镜像、容器等)
  • PLM产品管理系统有什么功能模块?PLM系统核心功能模块解析
  • WPS文字和Word文档如何选择多个不连续的行、段