重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
2.在device.c中提权限,
创新互联是一家专业提供浠水企业网站建设,专注与成都网站建设、网站制作、H5响应式网站、小程序制作等业务。10年已为浠水众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
3.每次都在java层去提权,cmd为提权命令
public void exeShell(String cmd){
try{
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(
new InputStreamReader(
p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
Log.i("exeShell",line);
}
}
catch(Throwable t)
{
t.printStackTrace();
}
}
1、首先确保你发送的数据是正确的,串口接收到这个数据后他能识别,并返回你想要的数据,如果你发送的命令本身不要求返回数据,inputstream是读取不到数据的。 2、其次,要确保发送数据的格式正确,比如一段16进制数据,你定义为String="01230545"类型,然后发送的时候out.write(str.getBytes());这样发送的数据是不对的,应该定义一个byte型的数组,然后发送这个数组 3、以上你都确保没问题了,你可以用循环去读取数据,当读到的内容大于0时停止读取。用循环读取你要确保你已经设置读取的超时时间了,不然程序有可能阻塞。
最近有项目需要实现windows机器和Android开发版进行UART串口通信,经过3天查找尝试,特记录一下最终方案,希望之后的同行少走弯路,最后在git上回开源我最终的方案希望大家支持。
Android 3.0.1
Gradle 4.1
ARM开发版 : RK3399
PC机器:Win10
开发机器:MAC 10.13.3
先上图
由于 android-serialport-api 项目中的so使用较old的ndk编译,所以在对于Android 6.0 以上版本兼容的时候会报错 dlopen failed: "has text relocations" 。且使用的mk进行编译,特升级为用cmake编译。
升级 android-serialport-api
项目结构:
app对应原项目中的各个Activity, androidserial 是module 对应编译之前的so,还有API的封装。可以直接引用androidserial,调用方法参考app目录下的activity。
注意 关于权限!
当接入开发板后如果发现 Error You do not have read/write permission to the serial port 需要root 权限 ,在开发者模式中开启root 权限 adb和应用
使用一下命令开启Android对串口的读写权限
setenforce 0 : 关闭防火墙,有人说关键是这,但是我的环境不用关闭,只要给权限就可以
注意 关于ttyS1 - 6 ttyS1 - 6 对应的是 UART 串口1-6 一般都是一一对应的。这个具体要看一下开发板的说明。
记录的比较糙,还请见谅,如有问题请留言,我看到后肯定回复。项目主要看结构,剩下的都是复制黏贴的事。 git地址:
我这边也在做Android和硬件设备的串口通信。
我的通信方式很简单,我这边发送数据,接收数据(接收数据的内容中有标识位让我判断这次接收到的数据的相应处理动作)
读数据的时候我做的是一个清空的办法,每一次读取数据,如果读到的数据准确则进行处理,如果有误就清空了在读。
如果说接收的数据要对应上发送的数据,你可以在Android这边发送数据后不在发送数据只读取,并开启一个计时器,当这段时间内么有接收到返回值就继续你的发送和读取功能