Android OTG之USB转串口模块通讯

微信公众号:CodingAndroid
CSDN:http://blog.csdn.net/xinpengfei521

1.背景简介

我们公司开发了一款室内机平板APP应用,要求平板能去控制智能门锁、等其他智能设备,智能门锁不是我们公司开发的,与我们公司属于合作关系。

2.分析及实现思路

  1. 智能门锁的控制是通过使用 433射频(不了解的请百度)来进行通讯的;
  2. 平板是没法与智能门锁直接进行通讯,但是厂家提供了一个433通讯模块(支持串口);
  3. 而平板(支持OTG)是支持USB转串口模块的,所以整个流程是可以走通的,如下图

3.主要代码实现

3.1初始化USB转串口模块

由于我们选用的是CH340模块,我们先导入ch340的 jar 包,然后在代码中检查手机/平板是否支持USB HOST模式,如果支持我们就初始化通讯时的相关参数:波特率、数据位、停止位等,具体的参数看你们之间通讯的协议。初始化完成之后,我们就可以打开USB进行通讯了,同时初始化完成之后我们需要开启一个读取数据的线程,这样,一旦收到数据或者相应的响应包(一般也叫ACK)我们就可以进行相应的处理了。

下面贴上初始化、及开启读取数据线程的代码实现:

 1    /** 2     * initialize ch340 parameters. 3     * 4     * @param context Application context. 5     */ 6    public static void initCH340(Context context) { 7        if (context == null) return; 8        Context appContext = context.getApplicationContext(); 9        mUsbManager = (UsbManager) appContext.getSystemService(Context.USB_SERVICE);10        if (mUsbManager != null) {11            HashMap<String, UsbDevice> deviceHashMap = mUsbManager.getDeviceList();12            for (UsbDevice device : deviceHashMap.values()) {13                if (device.getProductId() == 29987 && device.getVendorId() == 6790) {14                    mUsbDevice = device;15                    if (mUsbManager.hasPermission(device)) {16                        loadDriver(appContext, mUsbManager);17                    } else {18                        if (listener != null) {19                            listener.result(false);20                        }21                    }22                    break;23                }24            }25        }26    }27    /**28     * load ch340 driver.29     *30     * @param appContext31     * @param usbManager32     */33    public static void loadDriver(Context appContext, UsbManager usbManager) {34        driver = new CH34xUARTDriver(usbManager, appContext, ACTION_USB_PERMISSION);35        // 判断系统是否支持USB HOST36        if (!driver.UsbFeatureSupported()) {37            InLog.e(TAG, "Your mobile phone does not support USB HOST, please change other phones to try again!");38        } else {39            openCH340();40        }41    }42    /**43     * config and open ch340.44     */45    private static void openCH340() {46        int ret_val = driver.ResumeUsbList();47        InLog.d(TAG, ret_val + "");48        // ResumeUsbList方法用于枚举CH34X设备以及打开相关设备49        if (ret_val == -1) {50            InLog.d(TAG, ret_val + "Failed to open device!");51            driver.CloseDevice();52        } else if (ret_val == 0) {53            if (!driver.UartInit()) {  //对串口设备进行初始化操作54                InLog.d(TAG, ret_val + "Failed device initialization!");55                InLog.d(TAG, ret_val + "Failed to open device!");56                return;57            }58            InLog.d(TAG, ret_val + "Open device successfully!");59            if (!isOpenDeviceCH340) {60                isOpenDeviceCH340 = true;61                configParameters();//配置ch340的参数、需要先配置参数62            }63        } else {64            InLog.d(TAG, "The phone couldn‘t find the device!");65        }66    }67    /**68     * config ch340 parameters.69     * 配置串口波特率,函数说明可参照编程手册70     */71    private static void configParameters() {72        if (driver.SetConfig(baudRate, dataBit, stopBit, parity, flowControl)) {73            InLog.d(TAG, "Successful serial port Settings!");74            if (readDataRunnable == null) {75                readDataRunnable = new ReadDataRunnable();76            }77            mThreadPool.execute(readDataRunnable);78        } else {79            InLog.d(TAG, "Serial port Settings failed!");80        }81    }

3.2发送和接收数据

发送和接收数据都是按16进制进行发送和处理的,所以我们写了一个工具类方便发送,如下:

 1/** 2 * Created by xpf on 2018/2/6 :) 3 * Function:CH340数据处理工具类 4 */ 5public class CH340Util { 6    /** 7     * write data in ch340. 8     * 9     * @param byteArray 字节数组10     * @return 返回写入的结果,-1表示写入失败!11     */12    public static int writeData(@NonNull byte[] byteArray) {13        // 将此处收到的数组转化为HexString14        String hexString = bytesToHexString(byteArray, byteArray.length);15        InLog.i("TAG", "WriteHexString===" + hexString);16        return InitCH340.getDriver().WriteData(byteArray, byteArray.length);17    }18    /**19     * byte[]转换为hexString20     *21     * @param buffer 数据22     * @param size   字符数23     * @return 返回转换后的十六进制字符串24     */25    public static String bytesToHexString(byte[] buffer, final int size) {26        StringBuilder stringBuilder = new StringBuilder("");27        if (buffer == null || size <= 0) return null;28        for (int i = 0; i < size; i++) {29            String hex = Integer.toHexString(buffer[i] & 0xff);30            if (hex.length() < 2) stringBuilder.append(0);31            stringBuilder.append(hex);32        }33        return stringBuilder.toString();34    }35}

然后基本的发送和接收数据就写完了,发送数据时调用 writeData() 方法就可以了,接收数据也类似,具体的业务及通讯的协议、加密规则等都需要你和硬件提供方进行协商对接制定,由于涉及到公司机密,此处我就不进行说明了,只说一下最基本的发送和接收数据。

4.插入模块实现自动打开APP

Android中USB的插拔都会发送一个广播,我们只需要在AndroidMenifest.xml文件中接收这个广播就可以了,当我们入模块的时候就会启动我们的APP,第一次会弹出一个对话框询问我们是否打开xxx应用,我们点击确认即可,另外不是我们插入任何USB设备都打开我们的应用,所以我们需要过滤掉对我们没有用的设备,在res下建一个xml目录,新建usb_filter.xml文件,配置好我们这个USB设备模块的product-id和vendor-id,每个模块厂家这个值都是不一样的,有两种获取方式,一个是代码中枚举USB设备然后打印出来,另外一种方法是打开Logcat观察,然后插入USB设备,你会发现系统会打印出来这个USB设备等信息。

最后不要忘了添加权限:

1    <uses-feature2        android:name="android.hardware.usb.host"3        android:required="true" />4    <uses-permission android:name="android.hardware.usb.host" />

此处由于篇幅原因就不具体展开讲解更多细节了,核心的代码和实现我都已经贴出来了,要想查看更具体的实现,请下载我的demo:

https://github.com/xinpengfei520/USB-OTG-CH340-UART-interface

若在阅读过程中遇到什么问题,或有好提议,欢迎在公众号“CodingAndroid”中提出

长按后点击扫一扫关注!

原文地址:https://www.cnblogs.com/angel88/p/8684899.html

时间: 2024-10-02 11:44:37

Android OTG之USB转串口模块通讯的相关文章

android设备中USB转串口demo 下载

http://files.cnblogs.com/guobaPlayer/testUSB2Serial.apk USB转串口demo程序, 无需驱动,只要手机USB是OTG类型,插上我们的模块即可使用.当前波特率是9600bps 更多USB转GPIO,按键,PWM,红外,SPI,IIC,ADC,欢迎咨询,洽谈. 杭州蓝松科技,专注于android相关软硬件项目的方案开发工作,欢迎联系:qq1852600324" 公司网站:www.lansongtech.com android设备中USB转串口d

Android手机的USB转串口开发硬件以及软件源代码

Android手机的USB转串口开发Android手机的USB接口在各个领域都得到了广泛的应用和推广.笔者前几天接手一个项目,主要就是解决工业现场数据采集的问题,该项目是由深圳宏进科技委托笔者开发的.现场的总线是RS485和RS232总线,需要用电脑和手机方便的采集数据,保留并从现场发给深圳公司进行数据分析和问题的解决.硬件采用常用的USB转串口模块,既可以用电脑配合串口软件进行数据采集,又可以通过Android手机的USB配合相应的APP进行数据采集.硬件如下图:电脑的数据采集软件网上很多.笔

杭州蓝松科技推出的安卓端的USB转串口调试助手, 欢迎下载使用

下载地址:http://files.cnblogs.com/guobaPlayer/%E8%93%9D%E6%9D%BEUSB%E4%B8%B2%E5%8F%A3%E5%8A%A9%E6%89%8Bv1.1.apk 杭州蓝松科技: 专注于android软硬件, WIFI,蓝牙灯项目的外包开发工作, 已经完成的有 多媒体系统跑步机(带android系统)软硬件开发, 多媒体教学平台(全志A20)平台的开发. WIFI 模块, wifi控制板, 蓝牙灯泡,蓝牙门锁 USB转串口模块, S5PV210

Android USB转串口通信开发基本流程

好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERV

[驱动]内核添加USB转串口驱动支持

转自:http://blog.csdn.net/gatieme/article/details/49491325 目录 1. 问题 2. 驱动源码 3. 内核配置 4. 编译内核和模块驱动 5. 加载驱动 问题 这两天为了做gps和arm的通讯,不得不捣鼓这个东东.开发板是创维特jx2410,usb转串口线的芯片是pl2303.还好是这个芯片,让我没费多少力气,就达成了目的.因为linux对它已经支持了,我们只要编译.加载它的驱动就ok了. 驱动源码 一般来说USB转串口的驱动已经集成在内核中,

全志Android设备增加Usb host ADK 功能

全志Android设备增加Usb host ADK 功能 Usb Host ADK是指不采用USB驱动,直接用java与设备编程的 这样让Android 可以无需修改内核和驱动情况下方便与各种USB外设通讯.全志的CPU的资料都是公开的,因此我们在上面开发很多应用.但是发现无法使用usb host 接口. 一.测试 可以简单下载USB Device info 来测试 https://play.google.com/store/apps/details?id=aws.apps.usbDeviceE

为android系统添加USB AUDIO设备的放音和录音功能

http://blog.csdn.net/adits/article/details/8242146 开发环境简介 1. 主机系统: Unbuntu10.102. android系统版本: 4.0.3(Linux kernel 3.0.8) 综述 android的音频系统非常庞大复杂:涉及到java应用程序,java框架层,JNI,本地服务(AudioFlinger和AudioPolicyService),硬件抽象层HAL,ALSA-LIB和ALSA-DRIVER.本文将先分析音频系统的启动与模

利用FT232实现USB转串口

FT232B数据手册:http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232BL_BQ.pdf 常用的USB转串口的芯片有FT232.PL2303.CH340.利用这些芯片做的模块有很多卖的.但是当我们需要集成到PCB板上的时候就需要自己画了. 以上三个芯片PL2303有某些型号不支持win10而且稳定性不如CH340和FT232(被坑过),所以为了保险,采用稳定性最好的FT232(当然,CH340也很好,而且是国产).

LINUX下 USB转串口 【转】

转自:http://blog.163.com/smilexiao_11015461/blog/static/2122052182012102410399459/ 1.将设备u口插入pc2.输入#lsmod 先看看能否检测到这个设备,就看有没有pl2303字眼可以了.如果有,则不需要再装驱动.另外如果有的话最好再用dmesg | grep usb查找如果看到:“drivers/usb/serial/usb-serial.c: USB Serial support registered for Ge