Android 通过Otg/USB 进行串口通信(连接Arduino等开发板为例)

2023-05-16

本人手头的板子是Esp32,因为工作需要要把板子与手机连线,通过手机Otg功能进行串口通信,开发了一个简单的串口通信助手,现在记录下:

driver library配置

这里为了方便直接用lib。用到的是usb-serial-for-android

1.在project的build.gradle里添加:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

2.在app/module的build.gradle里添加:

dependencies {
    implementation 'com.github.mik3y:usb-serial-for-android:3.4.0'
}

3.Sync project
4.在AndroidManifest.xml添加:

<activity
    android:name="..."
    ...>
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>
    <meta-data
        android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
        android:resource="@xml/device_filter" />
</activity>

其中,在res目录下新建xml目录,添加device_filter.xml文件,实例如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 0x0403 / 0x60??: FTDI -->
    <usb-device vendor-id="1027" product-id="24577" /> <!-- 0x6001: FT232R -->
    <usb-device vendor-id="1027" product-id="24592" /> <!-- 0x6010: FT2232H -->
    <usb-device vendor-id="1027" product-id="24593" /> <!-- 0x6011: FT4232H -->
    <usb-device vendor-id="1027" product-id="24596" /> <!-- 0x6014: FT232H -->
    <usb-device vendor-id="1027" product-id="24597" /> <!-- 0x6015: FT230X, FT231X, FT234XD -->

    <!-- 0x10C4 / 0xEA??: Silabs CP210x -->
    <usb-device vendor-id="4292" product-id="60000" /> <!-- 0xea60: CP2102 and other CP210x single port devices -->
    <usb-device vendor-id="4292" product-id="60016" /> <!-- 0xea70: CP2105 -->
    <usb-device vendor-id="4292" product-id="60017" /> <!-- 0xea71: CP2108 -->

    <!-- 0x067B / 0x23?3: Prolific PL2303x -->
    <usb-device vendor-id="1659" product-id="8963" /> <!-- 0x2303: PL2303HX, HXD, TA, ... -->
    <usb-device vendor-id="1659" product-id="9123" /> <!-- 0x23a3: PL2303GC -->
    <usb-device vendor-id="1659" product-id="9139" /> <!-- 0x23b3: PL2303GB -->
    <usb-device vendor-id="1659" product-id="9155" /> <!-- 0x23c3: PL2303GT -->
    <usb-device vendor-id="1659" product-id="9171" /> <!-- 0x23d3: PL2303GL -->
    <usb-device vendor-id="1659" product-id="9187" /> <!-- 0x23e3: PL2303GE -->
    <usb-device vendor-id="1659" product-id="9203" /> <!-- 0x23f3: PL2303GS -->

    <!-- 0x1a86 / 0x?523: Qinheng CH34x -->
    <usb-device vendor-id="6790" product-id="21795" /> <!-- 0x5523: CH341A -->
    <usb-device vendor-id="6790" product-id="29987" /> <!-- 0x7523: CH340 -->

    <!-- CDC driver -->
    <usb-device vendor-id="9025" />                   <!-- 0x2341 / ......: Arduino -->
    <usb-device vendor-id="5824" product-id="1155" /> <!-- 0x16C0 / 0x0483: Teensyduino  -->
    <usb-device vendor-id="1003" product-id="8260" /> <!-- 0x03EB / 0x2044: Atmel Lufa -->
    <usb-device vendor-id="7855" product-id="4"    /> <!-- 0x1eaf / 0x0004: Leaflabs Maple -->
    <usb-device vendor-id="3368" product-id="516"  /> <!-- 0x0d28 / 0x0204: ARM mbed -->
    <usb-device vendor-id="1155" product-id="22336" /><!-- 0x0483 / 0x5740: ST CDC -->
</resources>

注: 这里的vendor-id和product-id每个设备都不一样,电脑上连接设备后通过设备管理器-端口-右键属性-详细信息-选择硬件id查看对应的vendor-id和product-id后,按照格式后进行添加。

连接并监听端口

需要先允许应用权限:

            // Find all available drivers from attached devices.
            UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
            List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
            if (availableDrivers.isEmpty()) {
                return;
            }

            // Open a connection to the first available driver.
            UsbSerialDriver driver = availableDrivers.get(0);
            UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
            if (connection == null) {
                // add UsbManager.requestPermission(driver.getDevice(), ..) handling here
                Toast.makeText(this, "Permission Error", Toast.LENGTH_SHORT).show();
                return;
            }

            port = driver.getPorts().get(0); // Most devices have just one port (port 0)
            try {
                port.open(connection);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
            //这里设置
                port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
            } catch (IOException e) {
                e.printStackTrace();
            }

            if(port.isOpen()){
                //progressBar.setVisibility(View.VISIBLE);
                //output("Set port Success!");

                mSerialIoManager = new SerialInputOutputManager(port, mListener);//添加监听
                mSerialIoManager.start();//开始
            }

这里我是连上后就立刻开始监听,Listener设置如下:

private final  SerialInputOutputManager.Listener mListener =
            new SerialInputOutputManager.Listener() {
                @Override
                public void onRunError(Exception e) {
                    Log.d("TAG", "Runner stopped.");
                }

                @Override
                public void onNewData(final byte[] data) {
                    //TODO 新的数据
                    runOnUiThread(()->{output(new String(data));});
                    //这里每次听到数据都直接打印出结果
                }
            };

发送数据

           try {
                //这里1000可以设置为0,表示一直等到数据发送成功
                port.write(strSend.getBytes(),1000);
                Toast.makeText(this, "Write Successful", Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                e.printStackTrace();
            }

关闭连接

            try {
                port.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(!port.isOpen()){
                //output("Close Port!");
                //progressBar.setVisibility(View.INVISIBLE);
            }

这样就实现了一个简单的串口通信app,后续还需要针对需求进行修改。

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

Android 通过Otg/USB 进行串口通信(连接Arduino等开发板为例) 的相关文章

随机推荐

  • 搭建PX4开发环境

    搭建PX4开发环境 官方网站PX4 IO xff0c 我使用的是ubuntu20 04 一 官方环境搭建 1 下载PX4固件 span class token function git span clone https github com
  • PX4二次开发——程序运行过程

    PX4二次开发 程序运行过程 一 写在前面 px4固件程序与最开始我们所学习的对单片机外设开发不同 xff0c 是因为飞行器控制系统是一个复杂的系统 xff0c 要求实时性好 xff0c 完成复杂的控制任务 xff0c 简简单单的按照之前所
  • PX4二次开发——编译与启动脚本的修改

    PX4二次开发 编译和启动脚本的修改 一 在修改之前我们先了解一下目录结构 1 1 总目录结构 上图 xff0c 是源码目录 Src xff1a 目录是源码目录存放所有的源码 xff0c 源码的查看都应该在这里 Mavlink xff1a
  • PX4二次开发——uorb订阅

    PX4二次开发 uorb订阅 一 写在前面 我们写了一个一个功能的模块 xff0c 这些模块并不是独立的 模块之间是有数据传递的 xff0c 这样才能组合到一起实现飞行控制的目的 那么解决模块之间的数据传递的方式就是通过uorb订阅的方式
  • PX4二次开发——PX4程序架构

    PX4程序架构 一 从RCS启动脚本可以看出哪些东西 启动脚本是一个神奇的东西 xff0c 它能够识别出你对应的飞机类型 xff0c 加载对应的混控器 xff0c 选择对应的姿态 位置估计程序以及控制程序 xff0c 初始化你需要的驱动程序
  • ROS

    ROS 1 ROS测试 启动ros master 打开一个终端roscore 启动小海龟仿真器 新打开一个终端rosrun turtlesim turtlesim node 启动海龟控制节点 新打开一个终端rosrun turtlesim
  • c++之vector 及 二维容器vector<vector<int>>初始化方法 及 三维数组初始化

    C 43 43 二维容器vector lt vector gt 初始化方法解析 遇到的问题 xff1a 在解决 求最大字串 问题时想到了用二位数组vector lt vector lt int gt gt table xff0c 但是不知道
  • react 中 setState( ) 的两种写法

    react 想要更新视图只能用 setState 方法 关于 setState 这里有三件事情需要知道 1 不要直接更新状态 xff0c 而是使用 setState 2 状态更新可能是异步的 React 可以将多个setState 调用合并
  • 在32位机器上实现64位数的除法

    概述 在32位机器上不能直接进行64位数据的除法 xff0c 比如a或b是64位的数据的时候 xff0c 要计算a b xff0c 不能直接data 61 a b 这样的计算 xff0c 编译器会报错 xff0c 缺少相关的指令 这就需要我
  • 基于Linux微计算机BBB的飞控开发之IMU数据获取与预处理

    基于Linux微计算机BBB的飞控开发之IMU数据获取与预处理 1 介绍2 Linux下调用I2C2 1 Shell下的调用方法2 2 使用C语言访问i2c设备 3 配置IMU4 读取IMU 1 介绍 最近在做Linux平台的飞控开发 xf
  • LINUX锁之读写锁(C++)

    读写信号量 rw semaphore 又叫读写锁 允许多个读者同时持有该信号量 xff1b 当有一个写者持有该信号量时 xff0c 其他读者跟写者不可持有该信号量 xff1b 当写者写完后 xff0c 可以降级为读者 读写信号量使用于读多写
  • px4中的mavlink协议

    原文地址 xff1a http blog csdn net oqqENvY12 article details 61615609 PX4 对Mavlink 协议提供了良好的原生支持 该协议既可以用于地面站 Ground ControlSta
  • px4姿态控制

    一 开篇 姿态控制篇终于来了 来了 来了 心情爽不爽 xff1f 愉悦不愉悦 xff1f 开心不开心 xff1f 喜欢的话就请我吃顿饭吧 xff0c 哈哈 其实这篇blog一周前就应该写的 xff0c 可惜被上一篇blog霸占了 但是也不算
  • APM飞行模式内部结构——以loiter为例

    飞行模式的架构我已经在上一篇博文中提到了 xff0c 本文将lotiter模式为例 xff0c 详细讲解一下lotier模式的内部控制链 lotier模式即为悬停模式 xff0c 也是GPS定点模式 在起飞前确保GPS是打开的 飞手控制的是
  • js中冒泡排序函数

    冒泡排序函数 function sort arr var len 61 arr length for var i 61 0 i lt len i 43 43 for var j 61 0 j lt len 1 i j 43 43 if ar
  • realsense install USB3.0

    sudo apt get update amp amp sudo apt get upgrade amp amp sudo apt get dist upgrade Navigate to librealsense root directo
  • 远程桌面teamViewer 和 远程控制MobaXterm软件

    1 teamViewer 官网下载 xff1a termViewer 注意 xff1a 安装teamViewer要选择个人非商业用途 xff0c 要不然安装不了 teamViewer有windows版本和linux版本 2 向日葵 Sunl
  • 电梯模拟程序

    Qt5编写的电梯控制模拟程序 附源码 图源代码链接地址 xff1a 系统架构逻辑实现elevator helevaotr cpp未完待续 用c 43 43 和qt5编写的单电梯模拟程序 简介 xff1a 这是一个在Qt5中构建的小型电梯模拟
  • Http_parser报文解析

    http协议 1 超文本传输协议 2 网站等大部分都使用的是http协议 3 客户端发出http协议请求数据包 服务器返回http协议响应数据包 请求 响应格式 1 http请求 span class hljs tag lt span cl
  • Android 通过Otg/USB 进行串口通信(连接Arduino等开发板为例)

    本人手头的板子是Esp32 xff0c 因为工作需要要把板子与手机连线 xff0c 通过手机Otg功能进行串口通信 xff0c 开发了一个简单的串口通信助手 xff0c 现在记录下 xff1a driver library配置 这里为了方便