Demo下载地址:
谷歌官方串口库使用

引言:

现在的串口通信多用于嵌入设备中,Android主板与各种板卡之间的通信。因此串口通信在未来智能设备中应用会很广泛。

现在市面上几乎所有的Android串口通信库都是用的Google开源的https://github.com/cepr/android-serialport-api封装而成。
但是很多第三方库质量参差不齐,出了问题也不知道是什么原因。因此自己基于官方公布.so来封装串口库就显得犹为重要。

  • 下载Goolgle官方串口库工程

前往https://github.com/cepr/android-serialport-api下载示例工程,并解压。会看到有两个文件夹,一个为android-sercd,一个为android-serialport-api。

  • 新建自己的串口库使用工程

新建自己的工程,如GoogleSerialDemo,将上图android-serialport-api->project->libs文件夹下的三个.so文件夹拷到自己工程的libs目录下。

拷贝后:

  • 配置自己的工程

双击android-serialport-api文件夹,进入project->src,这时你会发现又有一个android-serialport-api文件夹。

让我们来看看这个文件夹下的内容是什么?

该文件夹包含了写好的SerialPort.java类及SerialPortFinder.java类,这两个类的作用是提供应用调用底层串口C++代码的接口,而且完全是官方代码,因此不用担心被坑。
sample文件夹则是串口示例代码。
将这个android-serialport-api文件夹整个拷到自己工程下的src->main->java目录下。这时可能你有疑问了,我们需要的是SerialPort.java和SerialPortFinder.java这两个类,为什么要将整个文件夹一起拷过来?
这也是很多博客没有提及的。
原因其实也很简单,熟悉jni的都知道,jni调用是需要严格对应应用的包名的。而我们需要调用的是Google写好的C++代码,这些代码已经封装在.so库中,其包名已经确定了的。我们需要使用就必须知道其包名,其包名就是android_serialport_api。因此使用到jni的SerialPort.java和SerialPortFinder.java类必须要在android_serialport_api目录下。

拷贝过来后我们可以把目录下的sample删除掉以减少内存占用。然后打开工程我们就多了一个android_serialport_api的目录。

要使用串口还需要一步,还记得之前拷的那些.so的文件夹吗?这一步就需要在build.gradle的defaultConfig下面加入以下代码,注意是跟defaultConfig同级的,不是在defaultConfig声明里面。

sourceSets {main {jniLibs.srcDirs = ['libs']}}

  • 使用串口库

到了这一步就可以愉快地使用串口库了,再也不用担心第三方串口库封装出现的bug了。这里提供一个封装的基类供参考。

package com.mhwang.goolgleserialdemo;import android.util.Log;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;import android_serialport_api.SerialPort;/*** Description : 串口通信基类,定义串口通信的常量及操作方法* Author :mhwang* Date : 2018/6/14* Version : V1.0*/abstract class BaseSerialPort {InputStream mInputStream = null;OutputStream mOutputStream = null;SerialPort mSerialPort = null;Map<String,String> mSerialMap;abstract public boolean write(String data);abstract public boolean write(byte[] data);abstract public String receive();abstract public byte[] receiveBytes();abstract public boolean open();abstract public boolean close();/** 读取数据* @param inputStream 串口对象* @return byte[]数组,若没有,返回null*/byte[] readData(InputStream inputStream){
//        // 暂停200毫秒以等待数据返回       有些串口延迟会出现粘包,比如门卡板,因此根据实际情况添加
//        SystemClock.sleep(200);int size;try {if (inputStream == null) {showLog("inputStream is null");return null;}byte[] buffer = new byte[256];size = inputStream.read(buffer);byte[] data = new byte[size];System.arraycopy(buffer,0,data,0,size);if (size > 0) {return data;}else{showLog("receive no data");}}catch (Exception e){showLog(e.toString());}return null;}/** 打开串口* @param device 要打开的串口文件* @param baudrate 波特率* @param flag 标志* @return true,打开成功,false,打开失败*/boolean openSerialPort(File device, int baudrate, int flag){try {mSerialPort = new SerialPort(device, baudrate, flag);mInputStream = mSerialPort.getInputStream();mOutputStream = mSerialPort.getOutputStream();} catch (IOException e) {mInputStream = null;mOutputStream = null;e.printStackTrace();return false;}if (mInputStream == null || mOutputStream == null) return false;return true;}boolean closeSerialPort(){      // 这里不做事情是因为有时应用频繁打开关闭会使得再次打开串口收不到消息
//        try {//            if (mInputStream != null){//                mInputStream.close();
//                mInputStream = null;
//            }
//            if (mOutputStream != null){//                mOutputStream.close();
//                mOutputStream = null;
//            }
//            if (mSerialPort != null){//                mSerialPort.close();
//                mSerialPort = null;
//            }
//        }catch (Exception e){//            FileUtil.writeNote("BaseSerialPort-->"+ AppError.SERIAL_CLOSE_FAIL+e.toString());
//            return false;
//        }return true;}private void showLog(String s) {Log.d("BaseSerialPort-->",s);}
}

谷歌Android开源串口通信使用相关推荐

  1. Android 蓝牙串口通信工具类 SeriaPortUtil 2.0.+

    原文地址:https://www.shanya.world/archives/2fd981ea.html SerialPortUtil 提示 最新版本 3.0.+ 已发布,其对比 2.0.+ 版本,A ...

  2. Google官网开源串口通信Demo

    谷歌官方提供了android-serialport-api程序,用于实现串口通信. 谷歌官方源码: https://code.google.com/archive/p/android-serialpo ...

  3. android 串口开发第二篇:利用jni实现android和串口通信

    一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...

  4. Android USB 串口通信

    公司要求安卓PAD对接一台Windows的设备,实现双向数据传输. 是通过Windows设备的一根数据线进行数据传输的,涉及到的技术就是USB转串口通信,网上讲原理的一大堆,我就不讲了,直接上demo ...

  5. 关于Android蓝牙串口通信那点破事

    Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...

  6. android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例

    Qt串口通信开发之QSerialPort模块详细使用方法与实例 发布时间:2020-10-23 12:19:05 来源:脚本之家 阅读:111 作者:沧海一笑-dj Qt串口通信基础及名词说明 串口通 ...

  7. Android开发串口通信之开发板的串口通信

    本人最近刚开始学习android,学习大概将近一个月.学着学着突然想做个小东西出来.因为android前面的学习主要是UI 界面的学习,就想着做一个通信的串口 来实现app与外部的数据传输.通过界面的 ...

  8. Android 模拟串口通信过程

    https://gitee.com/isnullpointer/serialport-demo 1.环境 Android 模拟器选择了 Genymotion : 串口模拟的工具叫 Launch Vir ...

  9. Android USB串口通信实现 以及绕过USB弹框验证,50w字+的Android技术类校招面试题汇总

    前言 经常会有人问:"现在学习Android开发还有前景?"我的看法是现在只是市场趋于平稳了,对开发人员的要求越来越好了,这并不代表没有前景了. 移动开发不等于App开发,所有新的 ...

最新文章

  1. 2021年大数据Spark(五十一):Structured Streaming 物联网设备数据分析
  2. UE:增强现实AR可视化基本概念
  3. MFC如何打开文件路径
  4. php 函数静态变量,php 函数中静态变量使用的问题实例分析
  5. 吃鱼可以不挑刺了?华中农业大学发现鳊鱼肌间刺表达基因,可培育“无刺鱼”...
  6. 2021 年最值得学习的 5 大机器学习编程语言!
  7. 自动路由_小米路由器Mesh首销 多路由自动切换/为智能家居而生
  8. 使用Live555类库实现的网络直播系统
  9. 微软补丁日安全公告|11月份
  10. 微型计算机控制技术 潘新民 ppt,微型计算机控制技术期末复习参考-潘新民.ppt...
  11. python之花瓣美女下载
  12. lldp协议代码阅读_查看链路层发现协议(LLDP)关于交换机的端口状态信息
  13. IT技术分享的一点点总结
  14. 即时通讯系统架构设计-如何设计一款WhatsApp
  15. 当黑客被抓是种怎样的体验?
  16. 面向对象周总结1030
  17. 基于VS2017的C++ SuperLU混合编程
  18. k8s-linkerd
  19. 第四章 大数定律与中心极限定理(总结)
  20. OpenLayer学习之style样式的学习笔记

热门文章

  1. 有人用反证法对ChatGPT模型参数质疑?
  2. C++利用OpenCV识别二维码QRCode
  3. 计算机主板如何手动启动电源,主板启动电源-电脑开关电源的问题电脑开关电源插上主板可以启动,不插上主板,直接 爱问知识人...
  4. Python读取Matlab mat 文件
  5. 文件批量重命名怎么做?几个简单办法在这里
  6. 1、大家都是怎么看网工的,就这么看不起网络工程师吗?
  7. RFID电子标签未来发展三大趋势分析
  8. HTML-图片热点、网页内嵌、网页拼接、快速切图
  9. 简单的banner代码,用css实现滚动banner焦点图, 不用jq也能滚动banner
  10. 使用matlab画网格线--多条横线多条竖线