情景

一般硬件设备提供的内置串口数量是有限的,当串口不够用时,就需要通过USB来外接这些设备

CH341是一种芯片,它可以将以串口方式进行通信的设备,转接到USB口上进行通信

使用该方案,需要购买对应的CH341转换器,将串口设备转接到USB口上,转换器支持一个USB口接多个串口设备

准备

引入CH34XMultiUARTDriver.jar

这是一个串口转USB的驱动,支持CH341等型号的芯片

核心代码

//连接CH34X设备CH34X.connect();CH34X.read();//定期读取CH34X设备参数CH34xHandler.read();WorkThread.postByLoop(CH34xHandler::write);
package com.android.driver.ch34x;import android.app.PendingIntent;import android.content.Intent;import android.hardware.usb.UsbDevice;import android.hardware.usb.UsbManager;import android.os.Looper;import com.easing.commons.android.app.CommonApplication;import com.easing.commons.android.bin.Bytes;import com.easing.commons.android.code.Console;import com.easing.commons.android.helper.exception.BizException;import com.easing.commons.android.thread.Threads;import com.easing.commons.android.thread.WorkThread;import java.util.ArrayList;import java.util.List;import cn.wch.lib.ch34xMultiDriver;import cn.wch.lib.ch34xMultiManager;@SuppressWarnings("all")public class CH34X {protected static UsbManager service;protected static ch34xMultiManager manager;protected static List<UsbDevice> deviceList;protected static final List<Reader> readers = new ArrayList();protected static boolean connected = false;//判断设备是否连接public static boolean connected() {return connected;}//检查权限public static boolean checkPermission() {boolean hasPermission = true;for (UsbDevice device : deviceList) {boolean ret = service.hasPermission(device);if (!ret)hasPermission = false;}Console.info("CH34X Permission Check : " + hasPermission);return hasPermission;}//检测并连接设备public static void connect() {service = CommonApplication.ctx.getSystemService(UsbManager.class);manager = new ch34xMultiManager(CommonApplication.ctx, service);WorkThread.postByLoop("#CH34X连接线程", () -> {try {if (connected)return;if (Looper.myLooper() == null)Looper.prepare();//搜索设备manager.initDeviceList();deviceList = manager.usbDeviceList;Console.info("CH34X Find Device : " + deviceList.size());//检查并申请权限if (!checkPermission()) {for (UsbDevice device : deviceList) {Intent intent = new Intent("cn.wch.USB_PERMISSION");PendingIntent pendingIntent = PendingIntent.getBroadcast(CommonApplication.ctx, 0, intent, 0);service.requestPermission(device, pendingIntent);}}//打开设备boolean isDeviceOpen = true;for (UsbDevice device : deviceList) {boolean ret = manager.OpenUsbDevice(device);if (!ret)isDeviceOpen = false;}Console.info("CH34X Open Device : " + isDeviceOpen);//连接失败if (!isDeviceOpen)throw BizException.of("CH34X Connect Fail");//连接成功connected = true;Console.info("CH34X Connect Success");//配置设备boolean isDeviceConfigured = true;int index = 0;for (UsbDevice device : deviceList) {ch34xMultiDriver driver = manager.ch34xDriverList.get(index);index++;boolean ret = driver.SetConfig(9600, (byte) 1, (byte) 8, (byte) 0, (byte) 0);if (!ret)isDeviceConfigured = false;}Console.info("CH34X Configure Device : " + isDeviceConfigured);} catch (Throwable e) {manager.CloseAll();Console.error("CH34X Connect Fail");}Threads.sleep(3 * 1000L);});}//读数据public static void read() {WorkThread.post(() -> {final byte[] buffer = new byte[10 * 1024];while (true) {if (!connected)continue;try {int index = 0;for (UsbDevice device : deviceList) {ch34xMultiDriver driver = manager.ch34xDriverList.get(index);manager.SemDeviceList.acquire();int length = driver.ReadData(buffer, 10 * 1024);manager.SemDeviceList.release();if (length > 0) {byte[] newBytes = Bytes.copy(buffer, 0, length);onMessageRead(index, newBytes);}index++;}Threads.sleep(500);} catch (Throwable e) {Console.error("CH34X Read Fail");}}});}//数据读取成功public static void onMessageRead(int deviceIndex, byte[] bytes) {String hex = Bytes.byteArrayToHex(bytes);Console.info("CH34X Read", "Device-" + deviceIndex, hex);for (Reader reader : readers)reader.onMessageRead(deviceIndex, bytes);}//写数据public static void write(Integer deviceIndex, byte[] bytes) {if (!connected)return;if (deviceIndex == null)deviceIndex = 0;try {int index = 0;for (UsbDevice device : deviceList) {if (index != deviceIndex)continue;ch34xMultiDriver driver = manager.ch34xDriverList.get(index);manager.SemDeviceList.acquire();int ret = driver.WriteData(bytes, bytes.length);manager.SemDeviceList.release();String hex = Bytes.byteArrayToHex(bytes);Console.info("CH34X Write", "Device-" + deviceIndex, hex);index++;}} catch (Throwable e) {Console.error("CH34X Write Fail");}}//添加读取回调public static void addReader(Reader reader) {readers.add(reader);}//移除读取回调public static void removeReader(Reader reader) {readers.remove(reader);}}

源码下载

Android CH34X串口转USB.zip

【Android智能硬件开发】【011】安卓串口转USB相关推荐

  1. Android智能硬件开发心得总结(二)

    Android智能硬件开发心得总结(一) 6.关于屏幕显示 每次一个新项目的开发,我所做的第一件事就是确定所选定显示屏的型号规格,然后将规格书发给主板供应商让其先调屏参. 调屏参是很可能会出现无法点亮 ...

  2. 【Android智能硬件开发】【001】APK自启动

    前言 智能硬件不同于普通安卓手机,由于部署在工地现场,大多不会有专人维护 所以必须具备开机自启动.远程自动升级.自动重启.状态自动上报等功能 这篇博客,我们首先解决最简单的,开机自启动问题 注册权限 ...

  3. android智能家居开发视频教程,安卓app控制嵌入式软硬件开发智能家居视频教程...

    基础篇 01-课程简介&初识Android系统.avi 02-Android系统架构.avi 03-JDK安装.avi 04-Android开发环境搭建.avi 05-创建第一个Android ...

  4. Android 系统(252)---Android:BLE智能硬件开发详解

    Android:BLE智能硬件开发详解 目录 前言 BLE是个什么鬼 BLE中的角色分工 主要的关键词和概念  GATT(Generic Attribute Profile ) Characteris ...

  5. android 智能电视 电视盒子 安卓嵌入式硬件LAN压力测试

    android 智能电视 电视盒子 安卓嵌入式硬件LAN压力测试 android 智能电视 电视盒子 安卓嵌入式硬件LAN压力测试 android环境下部分必须用到的查询命令 操作命令 LAN口使用a ...

  6. 高通Android智能平台开发总结

    高通Android智能平台开发总结 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境. 7 1.2 搭建高通平台环境开发环境. 7 1.2.1 高通android智能平台概 ...

  7. 软硬整合技术、智能硬件开发与顶层设计应用_课程

    来自台湾的高焕堂老师,和来自美国硅谷的柯博文老师,共同指导... 课程名称:软硬整合技术.智能硬件开发与顶层设计应用 指导老师:高焕堂.柯博文 课程说明: 在智能&大数据时代,系统开发不仅仅攸 ...

  8. Android 智能硬件的理解(2018.5.25)

    1.智能硬件的理解 首先要认真的去了解目前的智能硬件行业,并且对将来智能硬件的发展有个深刻的认知.可以通过专业的招聘网站上的行业公司和招聘职业等方法了解企业.产品,和对你所做的硬件信息有大概的了解,不 ...

  9. 这是智能硬件开发门槛被降得最低的一次

    这是智能硬件开发门槛被降得最低的一次--如果"智键"."米键"和"快按钮"算智能硬件的话.这三个与耳机接头外形相似的"按钮&quo ...

最新文章

  1. python3最新稳定版本-python3稳定版
  2. linux dns已经配置,linux DNS 配置
  3. JPA JoinColumn vs mappedBy
  4. Python SQLAlchemy --3
  5. 【OpenStack】【Nova】安装与配置详解 (1)
  6. 10分钟学会python函数式编程
  7. 基于Spring Security的AJAX请求需要登录的解决方案
  8. win7_32下编译FFmpeg
  9. springmvc 表单中文乱码解决方案
  10. mysql 升级 乱码_mysql3升级到mysql5解决乱码心得
  11. java for语句_Java for循环语句
  12. android定位欺骗,1020. Android GPS定位欺骗(模拟定位)的3类途径4种方式
  13. 怎么复制图片的html代码,修改设置让你轻松复制网页文字或图片
  14. 你到底是想做产品,还是想做产品经理?
  15. 基于MATLAB的数字证件号识别
  16. Java异常(漂亮简洁的思维导图)
  17. 浅谈 Android 的安全启动和完整性保护
  18. Python08--文件读取及写入操作
  19. java Servlet 笔记
  20. tomcat实现https双向认证配置

热门文章

  1. 华硕ROG冰刃5和枪神5有什么区别 哪个好
  2. KSO-sqlserver以逗号分隔,并进行转为多行
  3. sdk没有登录什么意思_SDK登录与支付流程图文教程
  4. vue 生成二维码海报并进行微信分享
  5. WEEK 15 C ZJM 与纸条
  6. android系统刷机,安卓手机刷机完全攻略 从此不再怕刷机
  7. 罗杨美慧 20190919-4 单元测试,结对
  8. 【Eclipse使用技巧】格式化代码的方法 + 解决注释是繁体字的方法
  9. 下列关于python运算符的使用描述正确的是_以下关于 Python 字符串的描述中,正确的是( )...
  10. 右键-打开方式里没有EXCEL,找到路径也打不开的解决方法