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

业务场景:

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

直接上代码吧:

往设备中写echo命令:

//往gpio写
    private boolean RootCommand(String command) {
        Process process = null;
        DataOutputStream os = null;
        try {
            process = Runtime.getRuntime().exec("su");
            os = new DataOutputStream(process.getOutputStream());
            os.writeBytes(command + "\n");
            os.writeBytes("exit\n");
            os.flush();
            process.waitFor();
        } catch (Exception e) {
            return false;
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                process.destroy();
            } catch (Exception e) {
            }
        }
        return true;
    }

读GPIO:

//读GPIO
    private String getGpioString(String path) {
        String defString = "0";// 默认值
        try {
            @SuppressWarnings("resource")
            BufferedReader reader = new BufferedReader(new FileReader(path));
            defString = reader.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return defString;
    }

使用方式:

写入:
//表示输出引脚电平正常或翻转
RootCommand("echo normal >/sys/class/pwm/pwmchip2/pwm0/polarity")
//设置pwm周期,单位纳秒
RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/period");
//设置占空比 100-1000
RootCommand("echo 1000 >/sys/class/pwm/pwmchip2/pwm0/duty_cycle");
//echo 1开启跑马灯 echo 0 关闭跑马灯 
RootCommand("echo 1 >/sys/class/pwm/pwmchip2/pwm0/enable");

读取:返回当前灯是什么状态,1/0:开启/关闭
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 命令即可,如图:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DMA(Direct Memory Access,直接内存访问)是一种计算机数据传输技术,它允许外部设备(如GPIO)直接和主内存进行数据传输,而无需CPU的干预。 在使用DMA读取GPIO状态时,首先需要配置DMA控制器,以设置传输的目标内存地址和传输的数据量等参数。然后将GPIO端口设置为输入模式,以使得外部信号能够通过该端口传输至内存。 当外部信号触发GPIO端口时,DMA控制器将会触发数据传输操作,并将GPIO端口的状态读取到目标内存地址中。这样就能够在不占用CPU资源的情况下获取到GPIO状态信息。 DMA读取GPIO状态的优势是能够提高数据传输的效率,减少CPU的负载,从而使系统能够更高效地处理其他任务。另外,由于数据传输是通过硬件实现的,因此还能够提高数据传输的稳定性和可靠性。 需要注意的是,在使用DMA读取GPIO状态时,需要确保DMA控制器和GPIO端口的配置正确,以及传输过程的同步和互斥机制的实现,以避免出现数据冲突或错误。 总之,通过DMA读取GPIO状态可以提高系统的性能和效率,使系统能够更好地处理输入输出操作,从而满足实际应用中对GPIO状态的实时监测和处理需求。 ### 回答2: 直接内存访问(Direct Memory Access,DMA)是一种能够在处理器和外设之间直接传输数据的技术。在使用DMA读取GPIO状态时,可以通过以下步骤进行操作。 首先,需要将GPIO配置为输入模式。GPIO是一种通用的引脚,可以用于输入和输出。在DMA读取GPIO状态之前,需要将GPIO引脚设置为输入模式,以便从外部读取数据。 接下来,通过配置DMA控制器来设置DMA传输。DMA控制器是一种硬件单元,负责管理数据在内存和外设之间的传输。通过配置DMA控制器,可以设置DMA传输的源地址、目标地址、传输长度和传输方向等参数。 然后,启动DMA传输。一旦DMA控制器配置完成,就可以启动DMA传输,将GPIO状态从外设读取到内存中。启动DMA传输后,DMA控制器会自动完成数据的传输过程,无需处理器的干预。 最后,处理DMA传输完成的中断。当DMA传输完成时,会触发一个中断,通知处理器传输已完成。处理器可以在中断处理程序中读取GPIO得到的数据,并进行进一步的处理或分析。 通过使用DMA读取GPIO状态,可以实现高速的数据传输,提高系统的性能和效率。同时,DMA传输也减轻了处理器的负担,使处理器可以同时执行其他任务。 ### 回答3: DMA是直接内存访问(Direct Memory Access)的缩写,它可以实现高速、无CPU干预的数据传输。在嵌入式系统中,可以使用DMA来读取GPIO(General Purpose Input/Output)的状态GPIO是一种常见的通用输入输出接口,在嵌入式系统中用于连接和控制外部设备。通过将GPIO配置为输入模式,可以读取外部设备状态。 使用DMA读取GPIO状态的步骤如下: 首先,配置GPIO引脚到输入模式。通过设置相应的控制寄存器,将GPIO引脚配置为输入模式,以便读取外部设备状态。 然后,配置DMA控制器。通过设置DMA控制器相关的寄存器,配置DMA通道和传输的参数。这些参数包括源地址(即GPIO寄存器的地址)、目标地址(即内存中存储读取数据的地址)、传输长度等。 接下来,启动DMA传输。通过设置DMA控制器相关的寄存器,启动DMA传输。DMA控制器会自动读取GPIO寄存器的状态,并将数据传输到指定的内存地址。 最后,读取传输完成状态。可以通过读取DMA控制器状态寄存器的相关位,来判断DMA传输是否已经完成。如果传输完成,则可以读取内存中存储的GPIO状态数据。 总结:使用DMA读取GPIO状态可以实现高速、无CPU干预的数据传输。通过配置GPIO引脚为输入模式,并设置DMA控制器相关参数,可以实现自动读取GPIO寄存器的状态,并将数据传输到指定的内存地址。最后,通过读取DMA控制器状态寄存器,可以判断传输是否完成,并读取传输的GPIO状态数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值