尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

3步配置Android USB串口多端口:CDC/ACM双端口避坑笔记

3步配置Android USB串口多端口:CDC/ACM双端口避坑笔记 3步配置Android USB串口多端口CDC/ACM双端口避坑笔记【免费下载链接】usb-serial-for-androidAndroid USB host serial driver library for CDC, FTDI, Arduino and other devices.项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android把一块Arduino Leonardo插到手机上却发现设备明明有两个串口App却只能打开第一个usb-serial-for-android 是一个纯Java实现的 Android USB 串口驱动库不用root、不用内核驱动把CDC/ACM多接口设备解析成一个个独立的串口端口给你用。你将带走什么✅ 用 UsbSerialProber 扫描全部已连接的USB设备并建立驱动列表✅ 读取双端口CDC/ACM设备的真实端口数量分别打开每个 UsbSerialPort✅ 在 AndroidManifest 里注册 USB_DEVICE_ATTACHED 广播插线自动拉起App✅ 自定义VID/PID不在内置探测表时用 ProbeTable 补一条探测规则前置条件支持USB OTG的手机/平板加一条OTG转接线Android 4.23.1开始支持USB Host但README明确说4.2起才稳定可靠目标设备Arduino LeonardoATmega32U4、刷了双端口固件的Raspberry Pi Pico或任何CDC/ACM多接口芯片库版本 3.11.0allprojects { repositories { maven { url https://jitpack.io } } } dependencies { implementation com.github.mik3y:usb-serial-for-android:3.11.0 }为什么是这个版本这是README Quick Start当前给出的版本而且3.5.0起CDC/ACM设备改按接口类型探测双端口设备不用手写自定义探测器多端口支持靠的就是这条改动线。原理30秒USB CDC/ACM设备像一栋楼每个串口是一间房门牌是“控制接口”COMM类ACM子类数据走廊是“数据接口”CDC_DATA类开一扇门要一对接口各认领一个。库数房间的个数再给你建出同样多的钥匙UsbSerialPort。双端口设备就是描述符里有两对接口countPorts() 取控制/数据接口数量的较小值当端口数——固件如实报两对你就自动拿到两个端口。实操走查探测并打开Android USB串口多端口在清单文件注册USB Host广播在 AndroidManifest.xml 的目标Activity里加 USB_DEVICE_ATTACHED 的 intent-filter 和 meta-data后者指向声明响应哪些设备的 device_filter.xmlintent-filter action android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED / /intent-filter meta-data android:nameandroid.hardware.usb.action.USB_DEVICE_ATTACHED android:resourcexml/device_filter /这一段让系统在插进匹配的串口设备时自动弹出用该应用打开的选择框。过滤文件放在 res/xml/ 下直接参考示例项目的 device_filter.xml里面已收录FTDI、CP210x、PL2303、CH34x、Arduino、Pico等VID/PID完整清单写法见 AndroidManifest.xml。⚠️ 常见错误插线后App不弹起。检查 device_filter.xml 是否真的在 res/xml/ 下meta-data 的 name 是否一字不差写对——写错一个字符就静默失效不报错。探测设备并打开端口用 UsbSerialProber 拿到驱动列表再用 getPorts() 取端口列表双端口设备的列表就是两个元素UsbManager manager (UsbManager) getSystemService(Context.USB_SERVICE); ListUsbSerialDriver drivers UsbSerialProber.getDefaultProber().findAllDrivers(manager); UsbSerialDriver driver drivers.get(0); UsbDeviceConnection connection manager.openDevice(driver.getDevice()); UsbSerialPort port driver.getPorts().get(1); // 打开第二个端口 port.open(connection); port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);findAllDrivers 只查设备树、不需要权限openDevice 才是第一个要权限的调用首次需要弹 requestPermission 等用户授权setParameters 必须在 open 之后调它不会替你默认设置。⚠️ openDevice 返回 null 通常不是代码问题而是权限弹窗被点掉或App不在前台。要用 BroadcastReceiver 接权限结果并重试示例项目 MainActivity.java 有这套完整流程可以抄。核对端口计数逻辑插上双端口设备、App里却只有一个端口时翻一下 CdcAcmSerialDriver.java构造器调用 countPorts() 分别统计COMM类ACM控制接口和CDC_DATA数据接口的数量取较小值当端口数。也就是说固件必须上报两对完整接口只报一对某些阉割版CDC固件时库会退回单端口逻辑日志里打一句 device might be castrated ACM device。仓库 test/arduino_leonardo_bridge_multi_cdc/ 里有一份现成的双接口Leonardo固件USBDesc.h 是其中的USB描述符配置改完刷进去就能复现双端口。跑通数据端口打开后直接读写或把读交给独立线程回调byte[] response new byte[64]; int len port.read(response, 1000); port.write(ping.getBytes(), 1000);两个参数都是毫秒超时。完整终端界面含 SerialInputOutputManager 异步读、Xon/Xoff 流控在示例项目 TerminalFragment.java。注意关固定端口再重开时务必先 close()否则控制接口的占用不释放下次 open 直接抛 Could not claim。踩坑记录插上设备但日志里没有端口号现象findAllDrivers 返回空。原因设备接口类型和VID/PID都不在探测表里。解法先看logcat里接口类CDC/ACM按3.5.0起应能命中没命中就补一条自定义探测见下文扩展。openDevice 返回 null现象设备已插上openDevice 是 null。原因权限弹窗被点掉或App不在前台。解法注册 BroadcastReceiver 接权限结果再重试参考示例 MainActivity 的写法。双端口CDC/ACM设备只有一个端口现象getPorts().size() 1。原因固件只上报了一对接口。解法检查描述符里的接口对刷仓库 test/arduino_leonardo_bridge_multi_cdc/ 的双端口固件再验证。扩展与调优自定义探测遇到自定义VID/PID的新芯片往 ProbeTable 加一行再交给 UsbSerialProber 即可示例在 CustomProber.java内置VID/PID表在 ProbeTable.java。想深入可以看README的 Probing 一节。异步I/OSerialInputOutputManager 在独立线程里读数据、用回调推给UI主线程不会卡在 read 超时里多端口各自挂一个实例即可。想深入可以看 SerialInputOutputManager.java。控制线CdcAcmSerialPort 有后台线程读 DTR/RTS/CD 状态getCD() 能判断对端是否在线逻辑都在前面提到的 CdcAcmSerialDriver.java 里做多设备在线监控时用得上。速查清单项目内容依赖com.github.mik3y:usb-serial-for-android:3.11.0jitpack仓库系统Android 4.2USB OTG设备清单注册USB_DEVICE_ATTACHED intent-filter meta-data过滤文件res/xml/device_filter.xml可抄示例项目多端口计数规则min(COMM/ACM控制接口数, CDC_DATA数据接口数)打开顺序requestPermission → openDevice → port.open → setParameters → read/write关闭先 port.close() 再重开否则接口占用不释放延伸阅读README.md 官方文档含完整 Quick Start 和兼容芯片清单CdcAcmSerialDriverTest.java 单元测试看多端口计数是怎么被覆盖的test/pi_pico/ 双端口Pico固件刷一个现成的双端口CDC设备出来就能反复验证跑通之后记得去仓库Issues里翻翻别人新踩的坑多端口这块的描述符问题还不少。【免费下载链接】usb-serial-for-androidAndroid USB host serial driver library for CDC, FTDI, Arduino and other devices.项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表