Android串口通信apk源码详解(附完整源码)

 更新时间:2021年1月19日 20:00  点击:2736

1、SerialPortHelper「Android串口通信」介绍

原项目地址

https://github.com/freyskill/SerialPortHelper

Android串口通讯助手可以用于需要使用串口通信的Android外设,该库有如下特点:

1、串口通信部分使用C++实现,在笔者接触的部分设备上实测,使用C++实现与Google官方提供的Demo的方式要快;

2、支持且必须设置串口接收最大数据长度,初始化库时填入该参数,这样设置的原因是考虑在实际使用中,规定的串口通信协议格式一般会固定有最大长度,方便对数据进行处理;

3、支持命令一发一收,通过对串口的读写线程进行同步控制,命令会先加入到队列然后依次发送和接收,前提需要设置超时时间以及超时处理,参考下面第4、5点;

4、支持超时设置,设置超时时间后,如果命令在设置的时间内未反馈,则会根据设置的操作进行重发或退出该命令;

5、支持超时重发(可以N次重发,具体按需设置)与退出,退出会调用接收回调的 onComplete 方法。

2、运行apk演示

使用该库简单实现的串口调试助手工具,原来作者编译的版本有点问题,点击发送的时候会死掉,我重新修改了一份,大家在使用的时候如果有什么问题,可以提出来。

使用界面

串口apk使用界面

数据收发界面

3、Apk 下载地址

APK下载-SerialPortHelperV1.0.1-20201225.apk

https://github.com/freyskill/SerialPortHelper/blob/master/SerialPortHelperV1.0.1.apk

如果github下载比较慢

链接: https://pan.baidu.com/s/1GqR7taCh-iOqOU_57OSRtg 提取码: qrhj

4、软件接入方式

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:

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

Step 2. Add the dependency

dependencies {
  implementation 'com.github.freyskill:SerialPortHelper:v1.0.1'
}

5、使用说明

初始化需要设置maxSize,也可以设置isReceiveMaxSize该参数默认为false,详细说明如下:

int maxSize;  // 设置串口读取的最大数据长度

boolean isReceiveMaxSize; // 设置是否接收命令按最大长度进行返回,比如串口协议定义的格式长度为16个字节,这样可以设置maxSize为16,然后设置该参数为true,则接收的命令就会返回16个字节的长度。

提示: 设置isReceiveMaxSize为true是为了处理命令返回不完整的情况,例如完整命令长度为16,但是串口读的过程分几次返回。

SerialPortHelper serialPortHelper = new SerialPortHelper(32);
SerialPortHelper serialPortHelper = new SerialPortHelper(32,true);

5.1.初始化串口

//方式一:快速接入方式,设置好串口地址,或者地址和波特率即可,数据位、停止位、校验类型分别默认为8、1、N。
SerialPortHelper serialPortHelper = new SerialPortHelper(32);
//serialPortHelper.openDevice("dev/ttyS0");
serialPortHelper.openDevice("dev/ttyS0",11520);
// 数据接收回调
serialPortHelper.setSphResultCallback(new SphResultCallback() {
  @Override
  public void onSendData(SphCmdEntity sendCom) {
  Log.d(TAG, "发送命令:" + sendCom.commandsHex);
  }
 
  @Override
  public void onReceiveData(SphCmdEntity data) {
  Log.d(TAG, "收到命令:" + data.commandsHex);
  
  }
 
  @Override
  public void onComplete() {
  Log.d(TAG, "完成");
  }
 });

//方式二:通过SerialPortConfig设置相关串口参数
 
//串口参数
SerialPortConfig serialPortConfig = new SerialPortConfig();
serialPortConfig.mode = 0;  // 是否使用原始模式(Raw Mode)方式来通讯
serialPortConfig.path = path;  // 串口地址
serialPortConfig.baudRate = baudRate; // 波特率
serialPortConfig.dataBits = dataBits; // 数据位 取值 位 7或 8
serialPortConfig.parity = checkBits;// 检验类型 取值 N ,E, O
serialPortConfig.stopBits = stopBits; // 停止位 取值 1 或者 2
 
// 初始化串口
serialPortHelper = new SerialPortHelper(16);
// 设置串口参数
serialPortHelper.setConfigInfo(serialPortConfig);
// 开启串口
isOpen = serialPortHelper.openDevice();
if(!isOpen){
 Toast.makeText(this,"串口打开失败!",Toast.LENGTH_LONG).show();
}
// 数据接收回调
serialPortHelper.setSphResultCallback(new SphResultCallback() {
 @Override
 public void onSendData(SphCmdEntity sendCom) {
 Log.d(TAG, "发送命令:" + sendCom.commandsHex);
 }
 
 @Override
 public void onReceiveData(SphCmdEntity data) {
 Log.d(TAG, "收到命令:" + data.commandsHex);
 
 }
 
 @Override
 public void onComplete() {
 Log.d(TAG, "完成");
 }
});

5.2.数据发送与接收

// 发送数据
serialPortHelper.addCommands(sendHexTxt); // 发送十六进制字符串
serialPortHelper.addCommands(sendComBytes); // 发送字节数组
 
// 发送数据实体
SphCmdEntity comEntry = new SphCmdEntity();
comEntry.commands = commands; // 发送命令字节数组
comEntry.flag = flag;  // 备用标识
comEntry.commandsHex = DataConversion.encodeHexString(commands); // 发送十六进制字符串
comEntry.timeOut = 100; // 超时时间 ms
comEntry.reWriteCom = false; // 超时是否重发 默认false
comEntry.reWriteTimes = 5; // 重发次数 
comEntry.receiveCount = 1; // 接收数据条数,默认为1
serialPortHelper.addCommands(comEntry);

// 数据接收回调
serialPortHelper.setSphResultCallback(new SphResultCallback() {
 @Override
 public void onSendData(SphCmdEntity sendCom) {
 Log.d(TAG, "发送命令:" + sendCom.commandsHex);
 }
 
 @Override
 public void onReceiveData(SphCmdEntity data) {
 // 对于接受数据的SphCmdEntity,其中需要使用的有 
 // commandsHex 返回的十六进制数据
 // commands 返回的字节数组
 // flag 备用标识,例如标识该命令是相关操作
 Log.d(TAG, "收到命令:" + data.commandsHex);
 
 }
 
 @Override
 public void onComplete() {
 Log.d(TAG, "完成");
 }
});

5.3、关闭串口

serialPortHelper.closeDevice();

6、常见问题

6.1、串口打开失败

一般情况就是设备节点的权限不正确,可以使用命令查看串口的设备节点权限。

7、修改记录 20201225-修改

在原来的基础上简化了界面,把没有需要用的东西给干掉。

20201211-修改

基础代码和仓库是原来作者的,但是原来的代码经常挂掉,代码上做了一些修改。后续会有更多的修改。

到此这篇关于Android串口通信apk源码的文章就介绍到这了,更多相关Android串口通信apk源码内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • 用Intel HAXM给Android模拟器Emulator加速

    Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20
  • Android判断当前屏幕是全屏还是非全屏

    在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。 先来看一个android屏幕全屏实...2016-09-20
  • Android开发中布局中的onClick简单完成多控件时的监听的利与弊

    本文章来为各位介绍一篇关于Android开发中布局中的onClick简单完成多控件时的监听的利与弊的例子,希望这个例子能够帮助到各位朋友. 首先在一个控件加上这么一句:and...2016-09-20
  • Ubuntu 系统下安装Android开发环境 Android Studio 1.0 步骤

    Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试,可以在Linux,Mac OS X,Window...2016-09-20
  • Android实现简单用户注册案例

    这篇文章主要为大家详细介绍了Android实现简单用户注册案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-26