当前位置:   article > 正文

android 向硬件设备发送echo命令,读取设备状态(与GPIO交互)_android app echo gpio

android app echo gpio

业务场景:

自己遇到的业务上的一个需求,智能硬件设备两侧有跑马灯,需要通过应用层app根据特定指定控制跑马灯的频率,状态等需求。

直接上代码吧:

往设备中写echo命令

  1. //往gpio写
  2. private boolean RootCommand(String command) {
  3. Process process = null;
  4. DataOutputStream os = null;
  5. try {
  6. process = Runtime.getRuntime().exec("su");
  7. os = new DataOutputStream(process.getOutputStream());
  8. os.writeBytes(command + "\n");
  9. os.writeBytes("exit\n");
  10. os.flush();
  11. process.waitFor();
  12. } catch (Exception e) {
  13. return false;
  14. } finally {
  15. try {
  16. if (os != null) {
  17. os.close();
  18. }
  19. process.destroy();
  20. } catch (Exception e) {
  21. }
  22. }
  23. return true;
  24. }

GPIO

  1. //读GPIO
  2. private String getGpioString(String path) {
  3. String defString = "0";// 默认值
  4. try {
  5. @SuppressWarnings("resource")
  6. BufferedReader reader = new BufferedReader(new FileReader(path));
  7. defString = reader.readLine();
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. return defString;
  12. }

使用方式:

  1. 写入:
  2. //表示输出引脚电平正常或翻转
  3. RootCommand("echo normal >/sys/class/pwm/pwmchip2/pwm0/polarity")
  4. //设置pwm周期,单位纳秒
  5. RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/period");
  6. //设置占空比 100-1000
  7. RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/duty_cycle");
  8. //echo 1开启跑马灯 echo 0 关闭跑马灯
  9. RootCommand("echo 1 >/sys/class/pwm/pwmchip2/pwm0/enable");
  10. 读取:返回当前灯是什么状态,1/0:开启/关闭
  11. String gpioString = getGpioString("/sys/class/pwm/pwmchip2/pwm0/enable");

注:

1:写入的方法会返回一个布尔值,返回true 或 false,不过我觉得并没有什么用,一直返回的都是true,特别要注意的是echo命令行要特别注意,注意空格等,我自己就遇到了,少一个空格导致控制无效果,排查半天发现少了一个空格的问题。

2:读取的方法,获取的是string字符串,如我写入的命令是

echo 1 >/sys/class/pwm/pwmchip2/pwm0/enable

这行命令是控制灯的开关的,echo 1 是开启,echo 0 是关闭,读取灯的状态可以使用读取方法

String gpioString = getGpioString("/sys/class/pwm/pwmchip2/pwm0/enable");

“echo (1/0) > ” 不需要写入指令。

3:读取数据会有些小的误差问题

如:设置占空比:

RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/period");

设置完占空比之后通过:getGpioString("/sys/class/pwm/pwmchip2/pwm0/period");获取当前设置的占空比,返回可能是1000 或 接近1000.

第三点的问题不知道是硬件那边在设计上的问题还是怎么,不过对我这边影响倒不是很大,读取等的状态是开启还是关闭时倒是没有误差,能够正常使用也没有去管。希望能帮到不熟悉的朋友。

-------------------------------------------------分割线--------------------------------------------------------------

在写入项目之前,最好是通过黑窗口或者开发设备的控制器,通过adb命令发送命令行试一下效果

举例:在android studio下方的 Terminal 中:

1:确保当前连接上了要调试的设备,并且只有一台设备连接电脑。

2:通过发送命令:adb shell  找到当前设备

3:直接发送echo 命令即可,如图:

没报错没提示,就代表这行命令可行,已经写进设备中,可以时刻关注设备,看是否有效果即可。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/160675
推荐阅读
相关标签
  

闽ICP备14008679号