懒人必备Android串口通信库

目录

 前言

效果图

下载体验

PC端串口调试助手

项目依赖

属性支持

错误码参照表

框架初始化

数据监听状态

打开多路串口,目前支持6路串口 

发送数据 

关闭串口

粘包处理 

通用疑问解答

sdk地址


 前言

最近公司项目用到串口,需要和硬件或者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();

粘包处理 

  1. 不处理(默认)
  2. 首尾特殊字符处理
  3. 固定长度处理
  4. 动态长度处理 支持自定义粘包处理,第一步实现AbsStickPackageHelper接口

通用疑问解答

1.假如正常打开串口,但是收不到消息的话,请检查你的波特率
2.假如提示没有权限的话,请通过运行SelectSerialPortActivity起来看一下是否有读写权限
3.有好的建议或者问题欢迎提出

sdk地址

https://github.com/cl-6666/serialPort

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值