Android串口通信apk源码详解(附完整源码)
作者:写代码的篮球球痴 发布时间:2021-06-07 04:39:05
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-修改
基础代码和仓库是原来作者的,但是原来的代码经常挂掉,代码上做了一些修改。后续会有更多的修改。
来源:https://blog.csdn.net/weiqifa0/article/details/112300641


猜你喜欢
- 引言一个Java Gradle项目会涉及到资源的访问. 一般情况下会将当前项目所需的资源文件全部放置于resources文件夹下, 无论是m
- 什么是枚举?枚举是JDK5引入的新特性。在某些情况下,一个类的对象是固定的,就可以定义为枚举。在实际使用中,枚举类型也可以作为一种规范,保障
- 我就废话不多说了,大家还是直接看代码吧~List<Order> list = new ArrayList<User>
- 开发环境 android studio 3.0.1 已支持 kotlin1、定义接口interface CallBack{ fun call
- KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普
- 实例如下://选择文件,点击【浏览】,选择文件 private void button1_Click(object sender, Even
- 前言我们了解数组这个概念之前,我们先思考下面几个问题。如果我们需要两个数据,那么直接创建两个变量即可int a;int b;如果需要五个数据
- 在学习SpringBoot的过程中遇到一个问题,因为SpringBoot是集成了tomcat的,所以项目是打成jar包,通过SpringMV
- 同步容器在 Java 中,同步容器主要包括 2 类:Vector、Stack、HashTableCollections 类中提供的静态工厂方
- 重要属性1、scale: 小数点后的位数。如将1.234构建为BigDecimal,scale属性则为32、RoundingMode(对照数
- 背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆
- 前景概要在这个之前service_edu子模块下的功能是没有任何问题,创建了service_oss子模块之前失败了很多次,影响到了之前原本正
- 目录1、Stream API2、ParallelStreams执行原理3、ParallelStreams注意事项前言:并行编程势不可挡,Ja
- <script>//验证身份证号方法var test=function(idcard){var Errors=new Array
- 这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西
- 一、观察者模式基本概况1.概念观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subcri
- Controller层和Service层的类报错当出现以下这种情况的时候,可以看看pom.xml文件中是否少了jar包。当我出现这种情况的时
- 我们在安卓开发中安卓自带的控件满足不了我们的需求,因此我们就需要用到自定义View来满足我们的需求,在这里我要讲解的是自定义View实现选座
- 今天介绍一个自己做的快递单号查询的简单APP,供大家参考。由于需要使用http和json,本文在build.gradle(module:ap
- 下面通过代码给大家分享下依赖注入框架Autofac的使用,具体如下所示: Autofac是一款IOC框架,比较于其他的IOC框架,