最近用Android系统做串口的项目,用到了开源的android_serialport_api库。在用这个库遇到了各种问题,各种坑。在这总结一下。
1、引入so库
把android_serialport_api中的jni和libs两个文件拷到项目中,如图所示
2、找不到so
要解决这个问题,要在build.gradle的android标签中加入如下代码
sourceSets{
main(){
jniLibs.srcDirs = ['libs']
}
}
3、包名的问题
4、数据接收不完整
在接收数据的时候,发现数据总是接收不完整。后来经过调试发现一条数据有时候不是一次接收完,有可能分几次来接收(为什么会这样子,我也不太清楚,希望哪位大神帮我解决一下)。为了解决问题就要规范数据的传输协议,必须要包含包头和包尾。比如我的项目,每次传5个字节,包头为0xff,包尾为0x11。定义一个list集合用来存接收到的数据,代码如下
class MyThread extends Thread {
@Override
public void run() {
List<Byte> dataReceived = new ArrayList<>();
while (true) {
int size;
try {
byte[] buffer = new byte[16];
if (mInputStream == null) continue;
size = mInputStream.read(buffer);
if (size > 0) {
if (buffer[0] == 0x0f) {
for (int i = 0; i < size; i++) {
if (buffer[i] == 0x11 && dataReceived.size() == 4) {
//说明数据结束了
/数据接收完后,做你想做的事情
//最后记得清空集合
dataReceived.clear();
} else {
//数据还没结束,存入集合中
dataReceived.add(buffer[i]);
}
}
} else {
if (dataReceived.size() > 0 && (dataReceived.get(0) == 0x0f)) {
for (int i = 0; i < size; i++) {
if (buffer[i] == 0x11 && dataReceived.size() == 4) {
//说明数据结束了
//数据接收完后,做你想做的事情
//最后记得清空集合
dataReceived.clear();
} else {
//数据还没结束,存入集合中
dataReceived.add(buffer[i]);
}
}
} else {
dataReceived.clear();
continue;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}