Android串口通信apk源码

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下载比较慢,可以关注公众号「嵌入式Linux」,回复「serial」获取下载链接。

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

5.3、关闭串口

serialPortHelper.closeDevice();

6、常见问题

6.1、串口打开失败

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

7、修改记录

20201225-修改

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

20201211-修改

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

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NLP实战-中文新闻文本分类

目录 1、思路 2、基于paddle的ERINE模型进行迁移学习训练 3、分步实现 3.1 获取数据 (1)数据解压 (2)将文本转成变量,这里为了好计算,我只选了新闻标题做文本分类 3.2 中文分词 基于jieba的分词 基…

Ken Thompson爷爷的经典复制自身代码程序 - Python版本(只用两行!)

Ken Thompson可是大牛人了!不认识的人赶快Google/百度一下。Ken爷爷是Unix创始人,C语言鼻祖!Ken 当时大学时候没游戏玩,就自己给自己出题目写程序,就有了这个复制自身代码的程序了,相当经典,当然…

显示日期的指令: date

1.显示日期的指令: date (1)参数: (2)实例 转载于:https://www.cnblogs.com/yfacesclub/p/8434369.html

聚类算法——Birch详解

1 原理 1.1 B树 (1)m路查找树 一棵m路查找树,它或者是一棵空树,或者是满足如下性质的树: 根最多有m棵子树,并具有以下结构: ,是指向子树的指针,是关键码, 在子树中所…

Linux C高级编程——网络编程之API(5)

Linux C网络编程——API 宗旨:技术的学习是有限的,分享的精神的无限的。 一、基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的。网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也有一个类似于打开文件的函数…

机器学习在本体中的应用研究文献综述

机器学习在本体标注中的应用研究文献综述<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />本设计是基于语义搜索引擎展开研究&#xff0c;针对这个新兴的搜索引擎概念的提出&#xff0c;我们搜集了大量的资料并对此进行了一定的研…

20180209-shutil模块

下面讲解shutil模块的相关操作: 1.shutil.copyfileobj(fsrc, fdst, length16*1024) 将fsrc文件内容拷贝到fdst文件中&#xff0c;length是指一次拷贝多少个字节 源码&#xff1a;def copyfileobj(fsrc, fdst, length16*1024):"""copy data from file-like objec…

Pandas使用小技巧

1.获取存在缺失值的行或列 在进行缺失值筛选时&#xff0c;可以对缺失严重的行和列进行删除&#xff0c;首先进行缺失值的确定。 (1)缺失值的列和每列的缺失情况 #对每列的缺失值进行统计&#xff0c;并逆序排列 data.isnull.sum().sort_values(ascendingFalse) (2)缺失值的…

Linux C高级编程——网络编程之包裹函数

Linux网络编程&#xff08;六&#xff09;——包裹函数 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 系统调用不能保证每次都成功&#xff0c;必须进行出错处理。包裹函数就是把一般函数加了出错处理。包裹函数首字母大写。 /***********************…

输入一个数3256,将他从小到大输出,就是2356

这是知乎上面的一个题目&#xff0c;挺有意思&#xff0c;面试的时候应该是作为基础题&#xff0c;很多人不屑于看这样的题目&#xff0c;但是到自己些的时候&#xff0c;就会有很多问题。题目要求输入一个数3256&#xff0c;将他从小到大输出&#xff0c;就是2356分析输入的是…

在过渡到Agile中的十种错误

原文: http://www.ddj.com/architect/193402902为了走得更快必须减缓转变。从传统开发方法论到Agile的过渡中最普遍的10种错误&#xff1a;1直接全部参与。没有以试验项目作为开始。这样造成在项目推行新的方法论有很高风险&#xff0c;因为你在时间紧迫或风险较大的项目中没有…

深度学习之负荷分解——LSTM(一对多)任务场景

1.任务场景 以家庭为例&#xff0c;假设该家庭有m种电器和总负荷的曲线&#xff0c;其中&#xff0c;总负荷为,各个电器的负荷有&#xff08;m是电器个数&#xff0c;n是n个时刻&#xff09;。我们需要通过对总负荷曲线进行分解&#xff0c;识别出该负荷有几种电器同时运行实现…

这是我见过最秀的代码

这么秀的代码&#xff0c;你能写出来吗&#xff1f;技术主管来了都不好使&#xff0c;main函数里第一个函数必须是这个。佛祖保佑版&#xff1a;void godBless(void) { // _ooOoo_ // o8888888o // …

java-构建jar带哟参数提示的

使用command的cli包构建带有参数提示的jar包 需要引入command cli的依赖 <commons.version>1.2</commons.version> <dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>${commons.vers…

Cortex M3存储器映射

CortexM3存储器系统 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种 CM3 单片机间的移植。 存储空间的一些位置用于调试组件等私有外设&#xff0c;这个地址段被称为“私有外设区”。私…

sql server 分页

分页方案一&#xff1a;(利用Not In和SELECT TOP分页) 语句形式&#xff1a; SELECT TOP 10 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 20 id FROM TestTable ORDER BY id)) ORDER BY ID SELECT TOP 页大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 页大小*页数 i…

这些年,NLP常见的预训练模型剖析

“预训练-微调”&#xff08;pre-training and fine-tune&#xff09; 已经成为解决NLP任务的一种新的范式。基于预训练语言模型的词表示由于可以建模上下文信息&#xff0c;进而解决传统静态词向量不能建模“一词多义”语言现象的问题。传统的词向量有one-hot&#xff08;杜热…

Linux Ftrace 使用

Ftrace相关的文章如何利用ftrace精确跟踪特定进程调度信息1、Ftrace 是什么东西&#xff1f;Ftrace是一个直接内置在Linux内核中的跟踪工具。许多发行版在最近的发行版中已经启用了各种各样的Ftrace配置。Ftrace给Linux带来的好处之一是能够看到内核中发生了什么。因此&#xf…

java中原始数据文件的输入

in.data中的数据"28.7812 34.4632 31.3381 31.2834..."File fileInnew File("in.data");//File fileOutnew File("out.data");if(fileIn.exists()){System.out.println("the files path:"fileIn.getPath());System.out.println("…

Cortex M3寄存器组

寄存器组 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、通用目的寄存器R0~R7 R0-R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位&#xff0c;复位后的初始值是不可预料的。 2、通用目的寄存器 R8-R12 R8-R12 也被称为高组寄…