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演示

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

使用界面

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

串口apk使用界面

Android串口通信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

标签:Android,串口,apk
0
投稿

猜你喜欢

  • SpringMVC @RequestBody自动转json Http415错误的解决

    2022-09-12 13:12:34
  • C#日期控件datetimepicker保存空值的三种方法

    2021-11-14 19:22:38
  • 关于HashMap相同key累加value的问题

    2022-02-13 13:32:18
  • java调用ffmpeg实现转换视频

    2022-08-25 15:21:04
  • eclipse端口被占用问题的解决方法

    2022-10-04 07:01:54
  • Java ThreadPoolExecutor的参数深入理解

    2022-08-29 10:08:39
  • Java内存模型JMM与volatile

    2022-03-25 09:33:50
  • ibatis学习之搭建Java项目

    2021-11-02 00:35:29
  • C#实现char字符数组与字符串相互转换的方法

    2022-01-18 05:28:52
  • 对Java ArrayList的自动扩容机制示例讲解

    2022-04-09 07:58:25
  • Java实现删除排序数组中重复元素的方法小结【三种方法比较】

    2023-09-28 15:21:48
  • java导出数据库的全部表到excel

    2023-11-25 09:38:33
  • Java实现常见排序算法的优化

    2022-05-20 13:08:37
  • SpringBoot执行定时任务@Scheduled的方法

    2022-08-13 03:43:31
  • SpringBoot整合MongoDB的步骤详解

    2023-10-11 17:20:32
  • Spring整合Mybatis思路梳理总结

    2022-04-26 03:56:12
  • Spring+SpringMVC+MyBatis深入学习及搭建(二)之MyBatis原始Dao开发和mapper代理开发

    2021-07-24 06:36:00
  • obix协议在java中的配置和使用详解

    2023-11-25 20:59:42
  • mybatis trim标签的使用详解

    2022-07-10 23:27:54
  • Android实现底部滚轮式选择弹跳框

    2022-02-05 15:13:09
  • asp之家 软件编程 m.aspxhome.com