Android USB转串口通信开发实例详解

2023-05-16

好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程。

我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信。整个开发流程可以总结为以下几点:

1.发现设备

1

2

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);

Map<String, UsbDevice> usbList = usbManager.getDeviceList();

通过UsbManager这个系统提供的类,我们可以枚举出当前连接的所有usb设备,我们主要需要的是UsbDevice对象,关于UsbDevice这个类,官方是这样注释的:

1

2

This class represents a USB device attached to the android device with the android device

 acting as the USB host.

是的,这个类就代表了Android所连接的usb设备。

2.打开设备

接下来,我们需要打开刚刚搜索到的usb设备,我们可以将平板与usb外设之间的连接想象成一个通道,只有把通道的门打开后,两边才能进行通信。

一般来说,在没有定制的android设备上首次访问usb设备的时候,默认我们是没有访问权限的,因此我们首先要判断对当前要打开的usbDevice是否有访问权限:

1

2

3

4

5

6

7

8

9

if (!usbManager.hasPermission(usbDevice)) {

    usbPermissionReceiver = new UsbPermissionReceiver();

    //申请权限

    Intent intent = new Intent(ACTION_DEVICE_PERMISSION);

    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

    IntentFilter permissionFilter = new IntentFilter(ACTION_DEVICE_PERMISSION);

    context.registerReceiver(usbPermissionReceiver, permissionFilter);

    usbManager.requestPermission(usbDevice, mPermissionIntent);

    }

这里我们声明一个广播UsbPermissionReceiver,当接受到授权成功的广播后做一些其他处理:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

private class UsbPermissionReceiver extends BroadcastReceiver {

   public void onReceive(Context context, Intent intent) {

     String action = intent.getAction();

     if (ACTION_DEVICE_PERMISSION.equals(action)) {

       synchronized (this) {

         UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

         if (device.getDeviceName().equals(usbDevice.getDeviceName()) {

           if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {

            //授权成功,在这里进行打开设备操作

           } else {

            //授权失败

           }

         }

       }

     }

   }

 }

接下来,我们要找到具有数据传输功能的接口UsbInterface,从它里边儿找到数据输入和输出端口UsbEndpoint,一般情况下,一个usbDevice有多个UsbInterface,我们需要的一般是第一个,所以:

1

usbInterface=usbDevice.getInterface(0);

同样的,一个usbInterface有多个UsbEndpoint,有控制端口和数据端口等,因此我们需要根据类型和数据流向来找到我们需要的数据输入和输出两个端口:

1

2

3

4

5

6

7

8

9

10

for (int index = 0; index < usbInterface.getEndpointCount(); index++) {

        UsbEndpoint point = usbInterface.getEndpoint(index);

        if (point.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {

          if (point.getDirection() == UsbConstants.USB_DIR_IN) {

            usbEndpointIn = point;

          } else if (point.getDirection() == UsbConstants.USB_DIR_OUT) {

            usbEndpointOut = point;

          }

        }

      }

最后,才是真正的打开usb设备,我们需要和usb外设建立一个UsbDeviceConnection,它的注释很简介的说明了它的用途:

1

This class is used for sending and receiving data and control messages to a USB device.

它的获取也很简单,就一句代码:

1

usbDeviceConnection = usbManager.openDevice(usbDevice);

到这里,理论上平板和usb外设之间的连接已经建立了,也可以首发数据了,但是,我们大部分情况下还需要对usb串口进行一些配置,比如波特率,停止位,数据控制等,不然两边配置不同,收到的数据会乱码。具体怎么配置,就看你使用的串口芯片是什么了,目前流行的有pl2303,ch340等,由于篇幅问题,需要具体配置串口代码的朋友私信我我发给你。

3.数据传输

到这里,我们已经可以与usb外设进行数据传输了,首先来看怎么向usb设备发送数据。

 1.向usb外设发送数据

在第二步中,我们已经获取了数据的输出端口usbEndpointIn,我们向外设发送数据就是通过这个端口来实现的。来看怎么用:

1

int ret = usbDeviceConnection.bulkTransfer(usbEndpointOut, data, data.length, DEFAULT_TIMEOUT);

bulkTransfer这个函数用于在给定的端口进行数据传输,第一个参数就是此次传输的端口,这里我们用的输出端口,第二个参数是要发送的数据,类型为字节数组,第三个参数代表要发送的数据长度,最后一个参数是超时,返回值代表发送成功的字节数,如果返回-1,那就是发送失败了。

2.接受usb外设发送来的数据

同理,我们已经找到了数据输入端口usbEndpointIn,因为数据的输入是不定时的,因此我们可以另开一个线程,来专门接受数据,接受数据的代码如下:

1

2

3

4

5

6

7

8

9

10

11

int inMax = inEndpoint.getMaxPacketSize();

ByteBuffer byteBuffer = ByteBuffer.allocate(inMax);

UsbRequest usbRequest = new UsbRequest();

usbRequest.initialize(connection, inEndpoint);

usbRequest.queue(byteBuffer, inMax);

if(connection.requestWait() == usbRequest){

  byte[] retData = byteBuffer.array();

  for(Byte byte1 : retData){

    System.err.println(byte1);

  }

}

以上,就是usb转串口通信的基本流程,有些地方写的不是很全面,比如接收usb外设数据的方法应该还有别的,不足之处欢迎指正。

 

原文链接:http://blog.csdn.net/weixin_38251977/article/details/69944095

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android USB转串口通信开发实例详解 的相关文章

  • 如何在android中使用kso​​ap2库解析复杂的响应

    大家好 我正在使用 Ksoap2 库解析以下类型的响应 但没有成功获得结果 我的请求如下
  • 如何列出我的应用程序以供下载文件?

    我想通过我的应用程序从浏览器下载文件 我正在尝试将我的应用程序列在complete action using对话 它显示其他操作 例如查看文件等 但在下载文件的情况下 它不会显示在对话框中 我怎样才能像图片中那样列出我的应用程序 我在我的活
  • ActionBar 下拉微调器项目默认为第一项

    我试图设置默认情况下需要在微调器中选择的项目的索引 但它始终默认为 0 第一项 actionBar setDisplayShowTitleEnabled false actionBar setNavigationMode ActionBar
  • 在 Android 上使用 MediaPlayer 流式传输经过身份验证的视频

    我正在尝试从具有基本身份验证的 SharePoint 服务器 URL 流式传输和播放视频 用户名密码 在我的 Android 设备中browser Media Player VideoView但我得到了 错误 sorry this vide
  • Android:每次单击导航抽屉项时创建一个新片段更好,还是加载以前创建的片段更好?

    我正在为 Android 实现标准导航抽屉模式 用户可以从抽屉中导航到大约 10 个片段 目前 每次单击不同的导航抽屉项目时 我都会创建一个新的片段 如下所示 When a new navigation item at index is c
  • 任务执行失败 程序类型已存在

    我将这个新库包含到我的依赖项中 compile com github Triggertrap SeekArc v1 1 然后当我构建时出现构建错误 Error Exception in thread queued resource proc
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • Android 滚动视图无法以编程方式创建。

    我想在我的应用程序中使用滚动视图 我尝试将文本视图添加到滚动视图中 但除了滚动视图的背景颜色之外 我看不到任何渲染的内容 我是这样做的 public class MyView extends ViewGroup ScrollView myS
  • Android,如何限制TextView的宽度(并在文本末尾添加三个点)?

    我有一个TextView我想限制它的字符 实际上 我可以做到这一点 但我正在寻找的是如何在字符串末尾添加三个点 这表明文本已经继续 这是我的 XML 但没有点 尽管它限制了我的文本
  • AdMob 插页式广告仅显示一次

    当广告在一个会话内第二次或第三次打开时 LogCat 会显示错误消息 尝试使用不同的广告管理器启动新的 AdActivity 我通过应用程序主屏幕的 on resume 方法中的意图启动插页式广告 Override public void
  • 屏幕滚动时 GridView 内的项目会重复

    我使用 GridView 来显示一组用户可以选择的类别 网格的每个项目都由一个 ImageView 和一个 TextView 组成 两者都是从服务器检索的 当触摸一个项目时 另一个活动就会启动 我以为一切都很顺利 直到我注意到当我滚动屏幕时
  • 输入连接-如何删除选定的文本?

    我为 Android 制作了一个自定义键盘 当我按下键盘的退格按钮时 我使用 getCurrentInputConnection deleteSurroundingText 1 0 从输入字段中删除一个字母 但是 当我选择一些文本然后按退格
  • 开始使用 Honeycomb 进行 Android 开发 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Facebook Android 意图

    我对这个意图有疑问 这个意图是发送文本类型的消息 一切正常 电子邮件 短信 推特以及手机上的任何内容 但唯一有问题的是facebook 它会尝试以链接而不是文本的形式发布 Intent s new Intent android conten
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 如何在NavigationView的菜单项中设置椭圆形?

    我想在 NavigationView 的菜单项中设置 android ellipsize end 在我当前的实现中 当菜单项中的文本太长时 它只是在末尾被剪切 这是我到目前为止所尝试过的
  • Phonegap facebook 插件:android 的各种问题

    我正在尝试将 Phonegap 3 1 与 Phonegap facebook plugin 集成 以使我的应用程序能够使用 facebook 登录 https github com phonegap phonegap facebook p
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht
  • 查找配对的 Android 蓝牙设备是否在范围内的正确方法?

    我想编写一个充当蓝牙客户端的应用程序 我想做的是找出最好的方法来确定我支持的特定设备是否在范围内 而不是一直尝试在其上执行 BluetoothDevice connect 并失败如果不在范围内 这里我们假设设备已经配对 恐怕在特定设备处于范
  • 无法通过usb调试安装android应用程序

    我知道这是一个老问题 但我第一次尝试在 Redmi note 4 上安装我的应用程序 每当我尝试安装时 它都会显示一个对话框 安装失败 并显示消息无法建立会话 通过卸载现有版本的 apk 如果存在 然后重新安装 可能可以解决此问题 警告 卸

随机推荐

  • android USB

    google 在推出API 3 0后 就增加啦USB通讯这块 同时为API 2 3提供啦一个USB通讯吧 xff0c 这样也让2 3有啦USB通讯功能 不过只支持USBAccessory模式 USB通讯分为两种模式 xff1a xff08
  • 入门 Kotlin 和 Java 混合开发

    一 前沿 如果你学习过其他的编程语言 xff0c 你就会发现 Java 的语法很是哆嗦 xff0c 可是我们为什么没有放弃 Java 这门编程语言呢 xff1f 因为 JVM 是一个非常好的平台 xff0c 而且 Java 程序员目前在中国
  • kotlin 和java 混编

    如果你之前使用 Java 语言而没有 Kotlin 开发经验 xff0c 不用担心 xff0c Intellij IDEA 会帮你一键转换 xff0c 将 Java 代码转换成 Kotlin 代码 但是反过来就不行了 在 Mac 上 xff
  • Kotlin 基础语法

    Kotlin 文件以 kt 为后缀 包声明 代码文件的开头一般为包的声明 xff1a package com runoob main import java util fun test class Runoob kotlin源文件不需要相匹
  • ‘break‘ not in the ‘loop‘ or ‘switch‘ context

    使用phpexcel导出表格 xff0c 切换到php7 0报错 错误地址 xff1a FILE ThinkPHP Library Vendor phpexcel PHPExcel Calculation Functions php LIN
  • Android数据存储之SQLite

    概览 l 概述 l CRUD方法详解 l 注意事项 概述 对于大量数据的处理 xff0c 如果不想将数据存于服务器端 xff0c Android API提供了对关系数据库SQLite的支持 xff0c 在android SDK中tool目录
  • SQLlite在安卓中的基本详解和简单使用

    一 基础介绍 1 SQLite 是一个进程内的库 是一种轻量级的 自给自足的 无服务器的 无需配置的 事务性的SQL数据库引擎 和他其他的数据库一样 xff0c SQLite引擎不是一个独立的进程 xff0c 可以按应用程序需求进行静态或动
  • android开发中的数据库SQLite的使用

    其实学习android很久了 xff0c 关于数据存储 xff0c 之前学习的时候也一同学习过 xff0c 编程这些东西很久没用都忘得差不多了 xff0c 最近做个项目要用到 xff0c 所以又学习了一遍 android中关于数据的存储有好
  • Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1 数据准备 1 1 数据来源 2 曲线展示 2 1 MPAndroidChart获取 2 2 数据对象获取 2 3 数据展示 3 曲线完善 3 1 图表背景 边框 网格线修改 3 2 X Y轴值的自
  • Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1 数据准备 1 1 数据来源 2 曲线展示 2 1 MPAndroidChart获取 2 2 数据对象获取 2 3 数据展示 3 曲线完善 3 1 图表背景 边框 网格线修改 3 2 X Y轴值的自
  • SQLiteOpenHelper使用详解

    SQLiteOpenHelper 的子类 xff0c 至少需要实现三个方法 xff1a 1 构造函数 调用父类 SQLiteOpenHelper 的构造函数 这个方法需要四个参数 xff1a 上下文环境 xff08 例如 xff0c 一个
  • SQLiteOpenHelper的简单使用

    由于想学习GreenDao框架 xff0c 但是看了一下有的蒙圈 xff0c 所以先熟悉一下android原生的SQLiteOpenHelper的使用工具 xff1a SQLite Expert Personal SQLite Expert
  • android SQLiteOpenHelper 使用

    1 实体 package mydemo mycom demo2 entity public class UserInfo private int id private String username private String passw
  • SQLiteOpenHelper的简单使用

    由于想学习GreenDao框架 xff0c 但是看了一下有的蒙圈 xff0c 所以先熟悉一下android原生的SQLiteOpenHelper的使用 工具 xff1a SQLite Expert Personal SQLite Exper
  • 安卓案例:利用SQLiteOpenHelper操作数据库及表

    安卓案例 xff1a 利用SQLiteOpenHelper操作数据库及表 一 运行效果 二 涉及知识点 1 利用SQLiteOpenHelper类创建与升级数据库 这个类是一个抽象类 xff0c 我们必须继承该类创建一个子类 xff0c 实
  • delphi SimpleGraph控件的部分注释

    TSimpleGraph是一个delphi下的可视化图形开源控件 xff0c 有很强编辑态和运行态编辑功能 是学习开发DELPHI控件的一个很好的例子 控件本身有很强的扩展性 完全可以自定义绘制各种图形 控件的地址为http www del
  • java获取实体类的属性和值

    package com jackie day11 import java lang reflect Field import java lang reflect InvocationTargetException import java l
  • Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件 xff08 实现Android附件协议的硬件 xff09 xff1a USB附件和
  • Android USB串口开发

    因为第一次接触Android下的串口开发 xff0c 在网上找了很多例子都不能满足自己的需要以及不能正常使用 xff0c 于是结合网上的资源以及查阅资料 xff0c 终于完成了关于这个串口的开发 xff0c 在此记录下usb转串口通信开发的
  • Android USB转串口通信开发实例详解

    好久没有写文章了 xff0c 年前公司新开了一个项目 xff0c 是和usb转串口通信相关的 xff0c 需求是用安卓平板通过usb转接后与好几个外设进行通信 xff0c 一直忙到最近 xff0c 才慢慢闲下来 xff0c 趁着这个周末不忙