赞
踩
因为需要对接一个下机设备,主要是使用串口对下机进行通信,使用的是Google官方提供的开源,在接入过程中遇到了一些小小的麻烦,这里具体记录一下。
1.分析
①.这个是加载libserial_port.so这个库的时候出现的,google官方在android6.0之后加载so库把警告变成了错误,主要是因为在之前版本的 Android 上,如果应用请求系统加载包含文本重定位信息的共享库,系统会显示警告,但仍允许加载共享库。但是在Android6.0也就是sdk23之后系统就会拒绝加载该库,进而报错。
2.解决
①.Google提供了有libserial_port.so库的源文件,使用ndk-build并且修改Android.mk文件 ,在Android.mk文件下增加`LOCAL_LDFLAGS += -fPIC`。
②.使用cmake重新编译一次即可
这里不得不吐槽一下,有些设备是不会出现这样的问题,有些设备是会出现这样的问题,因为波特率不一样,以及下机开发者的做法不一样。
do {
byte[] buffer = new byte[1024];
if (mInputStream.available() > 0){
int size = mInputStream.read(buffer);
String value = new String(buffer,0,size, "UTF-8");
String tempValue = parseValue(value);
if (!tempValue.isEmpty()){
setIRTermoResult(mIdValue, tempValue);
return IRThermoReturn.OK;
}
}
Thread.sleep(10);
i ++;
}while (i <= 500);
*1.分析*
①.可能是在创建流对象的时候设置了一些和下机期望不相符的行为方式,导致available()无法从流中获取“可用的信息”,其实流中是有数据的。
*2.解决*
①.根据分析,我们需要重新给流分配行为, *mFd = open(device.getAbsolutePath(), baudrate, flags);*
这里可以看到传入了串口路径,波特率和一个flags。`public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException`在这里我们只是传入的一个0,0就是一个默认值。然后再看so库中的调用
LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags);
fd = open(path_utf, O_RDWR | flags );
LOGD("open() fd = %d", fd);
(*env)->ReleaseStringUTFChars(env, path, path_utf);
if (fd == -1)
{
/* Throw an exception */
LOGE("Cannot open port");
/* TODO: throw an exception */
return NULL;
}
}
这里的0_RDWR | flags 就是一个默认的调用 但是是阻塞的,我们不想阻塞并且要让流对象的行为方式改变,就需要加上0_RDWR | flags |O_NONBLOCK 也就是flags = 4000;
三.以上就是我开发过程中遇到的问题,应该关于serialport的所有问题都被我遇到了,如果你想进一步知道到底下机是否有和你进行通信你可以 打开命令行,输入 adb shell 进入你的Android系统,输入ls dev 罗列你的串口配置路径,cd到你的串口位置,然后启动下机测量数据并返回,如果有信息返回证明下机链接正确,那么你就放心的进行对接吧!找串口是很关键的一点!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。