接下来看一下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