目录
前言
最近公司项目用到串口,需要和硬件或者pc中间经过串口通信,其实也挺简单的,已经封装成sdk库,欢迎大家使用,有问题欢迎大家提出。
效果图
下载体验
PC端串口调试助手
通过网盘分享的文件:pc串口调试助手.zip 链接: 百度网盘 请输入提取码 提取码: f7sh --来自百度网盘超级会员v9的分享
项目依赖
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.cl-6666:serialPort:v4.1.1'
}
属性支持
属性 | 参数 |
---|---|
数据位 | 5,6,7,8 ;默认值8 |
校验位 | 无奇偶校验(NONE), 奇校验(ODD), 偶校验(EVEN), 0校验(SPACE), 1校验(MARK); 默认无奇偶校验,对应关系NONE(0)-ODD(1)-EVEN(2)-SPACE(3)-MARK(4); |
停止位 | 1,2 ;默认值1 |
标志位 | 不使用流控(NONE), 硬件流控(RTS/CTS), 软件流控(XON/XOFF); 默认不使用流控 |
错误码参照表
错误编码 | 错误说明 |
---|---|
1000 | 未知错误 |
1001 | 串口打开失败 |
1002 | 串口数据发送失败 |
1003 | 未知的串口类型,请检查串口路线是否错误 |
1004 | 串口数据接收失败 |
1005 | 未初始化的串口 |
1006 | 文件未找到 |
1007 | 串口数量不符合要求,目前最大只支持6路串口 |
1008 | 黏包数量配置不合法,请检查是否配置了错误的参数,或者没有配置 |
1009 | 权限被拒绝,请检查是否有串口的读写权限,建议运行SelectSerialPortActivity查看 |
框架初始化
没有日志记录相关需求
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
/**
* 初始化串口框架 简单配置
* 是否打开日志、日志标识、串口接发间隔速度
* 数据量单一情况下建议设置100 数据量大情况建议根据实际情况设置
*/
SerialUtils.getInstance().init(this,true,"TAG",100);
/**
* 初始化串口框架 简单配置
* 是否打开日志、日志标识、串口接发间隔速度
* 数据量单一情况下建议设置50 数据量大情况建议根据实际情况设置
* 设置数据位、校验位、停止位
*/
SerialUtils.getInstance().init(this,true,"TAG",
50,8,0,1);
//串口粘包配置,框架默认使用BaseStickPackageHelper,无特殊需求,可不设置,多串口情况需要配置,这里面配置需要和manyOpenSerialPort里面的顺序对应,总共支持6路
SerialUtils.getInstance().setStickPackageHelper(new BaseStickPackageHelper(),
new BaseStickPackageHelper());
}
}
需要日志相关需求配置,请按需配置,需要就配
//初始化日志框架
XLogConfig logConfig = new XLogConfig.Builder()
//全局TAG
.setGlobalTag("TAG")
//是否包含线程信息
.setWhetherThread(true)
//Xlog是否可用
.setWhetherToPrint(true)
//是否存储日志到本地 log文件的有效时长,单位毫秒,<=0表示一直有效
.setStoreLog(true, 0)
//堆栈的深度
.setStackDeep(5)
//外界注入对象的序列化
.setInjectSequence(new XLogConfig.JsonParser() {
@Override
public String toJson(Object src) {
String json = new Gson().toJson(src);
return json;
}
}).build();
//配置串口相关参数
SerialConfig serialConfig = new SerialConfig.Builder()
//配置日志参数
.setXLogConfig(logConfig)
//配置发送间隔速度
.setIntervalSleep(200)
//是否开启串口重连 目前还没有实现
.setSerialPortReconnection(false)
//标志位
.setFlags(0)
//数据位
.setDatabits(8)
//停止位
.setStopbits(1)
//校验位:0 表示无校验位,1 表示奇校验,2 表示偶校验
.setParity(0)
.build();
SerialUtils.getInstance().init(this, serialConfig);
业务代码参数设置
//设置数据位
SerialUtils.getInstance().getmSerialConfig().setDatabits();
//设置停止位
SerialUtils.getInstance().getmSerialConfig().setStopbits();
//校验位:0 表示无校验位,1 表示奇校验,2 表示偶校验
SerialUtils.getInstance().getmSerialConfig().setParity();
//标志位
SerialUtils.getInstance().getmSerialConfig().setFlags();
//设置串口接收间隔时间
SerialUtils.getInstance().getmSerialConfig().setIntervalSleep();
//自定义粘包处理类,下面有介绍说明
SerialUtils.getInstance().setStickPackageHelper("自定义粘包处理类");
数据监听状态
SerialUtils.getInstance().setmSerialPortDirectorListens(new SerialPortDirectorListens() {
/**
* 接收回调
* @param bytes 接收到的数据
* @param serialPortEnum 串口类型
*/
@Override
public void onDataReceived(byte[] bytes, SerialPortEnum serialPortEnum) {
Log.i(TAG, "当前接收串口类型:" + serialPortEnum.name());
Log.i(TAG, "onDataReceived [ byte[] ]: " + Arrays.toString(bytes));
Log.i(TAG, "onDataReceived [ String ]: " + new String(bytes));
}
/**
* 发送回调
* @param bytes 发送的数据
* @param serialPortEnum 串口类型
*/
@Override
public void onDataSent(byte[] bytes, SerialPortEnum serialPortEnum) {
Log.i(TAG, "当前发送串口类型:" + serialPortEnum.name());
Log.i(TAG, "onDataSent [ byte[] ]: " + Arrays.toString(bytes));
Log.i(TAG, "onDataSent [ String ]: " + new String(bytes));
}
/**
* 串口打开回调
* @param serialPortEnum 串口类型
* @param device 串口号
* @param status 打开状态
*/
@Override
public void openState(SerialPortEnum serialPortEnum, File device, SerialStatus status) {
XLog.i("串口打开状态:"+device.getName()+"---打开状态:"+status.name());
switch (serialPortEnum) {
case SERIAL_ONE:
switch (status) {
case SUCCESS_OPENED:
ToastUtils.show("串口打开成功");
break;
case NO_READ_WRITE_PERMISSION:
ToastUtils.show("没有读写权限");
break;
case OPEN_FAIL:
ToastUtils.show("串口打开失败");
break;
}
break;
case SERIAL_TWO:
XLog.i("根据实际多串口场景演示");
break;
}
}
});
//多路串口打开逻辑.....
打开多路串口,目前支持6路串口
//多串口演示
List<Driver> list2=new ArrayList<>();
//串口ttyS4
list2.add(new Driver("/dev/ttyUSB0", "115200"));
list2.add(new Driver("/dev/ttyUSB1", "115200"));
list2.add(new Driver("/dev/ttyS4", "115200"));
SerialUtils.getInstance().manyOpenSerialPort(list2);
发送数据
- 参数:发送哪路串口,发送数据 byte[]
- 返回:发送是否成功
//todo 这里默认发送一路串口,根据用户自定义
boolean sendBytes = SerialUtils.getInstance().sendData(SerialPortEnum.SERIAL_ONE, sendContentBytes);
关闭串口
SerialUtils.getInstance().serialPortClose();
粘包处理
- 不处理(默认)
- 首尾特殊字符处理
- 固定长度处理
- 动态长度处理 支持自定义粘包处理,第一步实现AbsStickPackageHelper接口
通用疑问解答
1.假如正常打开串口,但是收不到消息的话,请检查你的波特率
2.假如提示没有权限的话,请通过运行SelectSerialPortActivity起来看一下是否有读写权限
3.有好的建议或者问题欢迎提出