推荐一个好用的串口通讯框架OkSerialPort

推荐一个好用的串口通讯框架OkSerialPort


公司转型智能硬件几个月了多个项目都需要用到串口通讯,后续还会有很多新项目也是一样,最近在github上发现一个大牛新写的通讯框架OkSerialPort,使用起来简单,大大减少开发代码量提高开发效率,而且移植新项目变的很简单了,之前我们用的只是简单的结合Rxjava做成响应式,但是数据组装和解析等这些每次都需要重新写,每当一个新项目需要使用串口通讯的时候,复制代码配置协议规则是一件很让人头疼的事,需要拷贝多个配置协议及组装和解析命令类文件还得在其中根据协议不同做修改,熟悉代码的同事都需要半天的时间,如果不熟悉的效率更低了。

接下来看一下OkSerialPort这个框架怎么使用

首先创建一个类文件来配置自己的协议规则,该框架配置是通过注解的形式


/** 按照协议顺序配置  这里注意一下帧头,不管你的协议规定帧头多少个字节都需要一个字节一个字节配置,后面在指定帧头位数
    **
     * 帧头
     */
    @Protocol(index = 0, length = 1, value = (byte) 0xEE)
    public  byte frameHeader ;

    /**
     * 原地址
     */
    @Protocol(index = 2, length = 1, value = (byte) 0x00)
    public  int rawAddress;


    /**
     * 目标地址
     *  */
    @Protocol(index = 3, length =5, value = (byte) 0x05)
    public int deviceAddress  ;

    /**
     * 数据长度
     */
    @Protocol(index = 4, length = 1,value = 0)
    public int dateNumber;


    /**
     * 命令码
     */
    @Protocol(index = 5, length = 1)
    public  int command ;


    /**
     * 流水号
     */
    @Protocol(index = 6,length = 1)
    public  int flowNulber;

    /**
     * 数据
     */
    @Protocol(index = 7)
    public  int data ;

    /**
     * 异或字节
     */
    @Protocol(index = 8, length = 1)
    public  int OXR ;


/** ---- end  按照文档协议配置结束 这部分根据自身协议自由配置   -----*/




/**  -----  下面这是必须要配置的    --------------*/

   /**
     * 读取数据长度这个字段字节开始位置角标从0开始,示例文档是在第5位,如果你的协议没有数据长度这个字段那么传-1
     */
    @Protocol(dataLenFirst = 4)
    public int dataLenStart;

    /**
     * 数据长度字段在你配置协议对应的角标位置(就是上面index的值) ,如果你的协议没有数据长度这个字段那么传-1
     */
    @Protocol(dataLenIndex = 4)
    public int dataLenIndex;

    /**
     * 读取数据这个字段开始字节位置,示例文档是第8位,如果你的协议没有数据这个字段那么传-1
     */
    @Protocol(dataFirst = 7)
    public int dataFirst ;

    /**
     * 读取命令码字节开始开始,例文档是第6位,如果你的协议没有这个字段那么传-1
     */
    @Protocol(commandFirst = 5)
    public int commandFirst ;

    /**
     * 命令码字段在你配置协议对应的角标位置(就是上面index的值),如果你的协议没有这个字段那么传-1
     */
    @Protocol(commandIndex = 5)
    public  int commandIndex ;

    /**
     * 流水号起始位置 如果你的协议没有流水号这个字段那么传-1
     */
    @Protocol(runningNumberFirst = 6)
    public int runningNumberFirst ;


    /**
     * 帧头字节数
     */
    @Protocol(frameHeaderCount = 1)
    public static int frameHeaderCount;
    /**
     * 校验码规则  0表示异或校验  1表示CRC16校验
     */
    @Protocol(checkCodeRule = 0)
    public static int checkCodeRule;


    /**
     * 通信协议最短字节不包含数据域
     *比如示例的:(帧头(2字节)	+源地址(1字节)+目标地址(1字节)+数据长度(1字节)+命令码(1字节)+数据(n字节)+异或校验(1字节))
     * 帧头	    源地址      目标地址	数据长度  命令码    协议版本   	数据      异或校验
     * 2个字节	1个字节	    1个字节  	1个字节	 1个字节	1个字节    n个字节    1个字节
     */
    @Protocol(minDalaLen = 8)
    public static int minDalaLen;


 /**
     * 心跳命令
     */
    @Protocol(heartbeatCommand = (byte) 0xA9)
    public int heartbeatCommand2;

/**  ----- end 分割线    --------------*/

来绑定协议规则

OkSerialPort_Protocol.bind();

这样我们的协议配置就大功告成了!!!,接下来就可以直接使用了。

打开串口

OkSerialport.getInstance().open(new SerialPortParams.Builder()
                .addDeviceAddress("串口地址")//默认/dev/ttyS0
                .addBaudRate(波特率)//默认115200
                .addHeartCommands(心跳命令集合)
                .isReconnect(是否自动重连)//默认false
                .callback(new SerialportConnectCallback() {
                    @Override
                    public void onError(ApiException apiException) {

                    }

                    @Override
                    public void onOpenSerialPortSuccess() {
                        Log.e("ljw", "onOpenSerialPortSuccess" );

                    }

                    @Override
                    public void onHeatDataCallback(DataPack dataPack) {
                        String command = ByteUtil.bytes2HexStr(dataPack.getCommand());
                        Log.e("ljw", "心跳上来的命令:" + command + ",对应的数据 = " + ByteUtil.bytes2HexStr(dataPack.getData()));
                    }
                })
                .build());

发送命令

OkSerialport.getInstance().send(null,"数据",命令码,new SendResultCallback() {
            @Override
            public void onStart(CmdPack cmdPack) {
                
            }

            @Override
            public void onSuccess(DataPack dataPack) {
	   		 //这里是子线程,如果有刷新UI的动作,记得切换回UI线程
               Log.e("数据" +dataPack.getData() )
          }

            @Override
            public void onFailed(BaseSerialPortException dLCException) {
                
            }
        });

这样在项目搭建串口通讯时快速方便,而且在新项目使用相同的协议规则时移植也变得简单,只需要把我们那个配置协议规则的一个类文件拷贝过去就可以只直接使用了。

这里我也只是简单的介绍了一下,想了解更详细的朋友可以直接去github查看详情
github地址:https://github.com/Jarvie-cn/OkSerialPort

你可能感兴趣的:(推荐一个好用的串口通讯框架OkSerialPort)