Skip to content

linux gpio#

在 Linux 上,GPIO(通用输入输出)通常通过 /sys/class/gpio 接口进行控制。这个接口提供了一种用户空间下访问 GPIO 引脚的方式,不需要编写内核模块。

步骤#

以下步骤演示了如何使用 C++ 代码在 Linux 系统上读写 GPIO。

1. 导出 GPIO 引脚#

在操作 GPIO 引脚之前,首先需要导出它。假设我们使用 GPIO 引脚 24(具体的 GPIO 编号根据硬件而异):

#include <iostream>
#include <fstream>
#include <string>
#include <unistd.h>

void export_gpio(int pin) {
    std::ofstream export_file("/sys/class/gpio/export");
    if (!export_file) {
        std::cerr << "Error: Unable to export GPIO" << std::endl;
        return;
    }
    export_file << pin;
}

void unexport_gpio(int pin) {
    std::ofstream unexport_file("/sys/class/gpio/unexport");
    if (!unexport_file) {
        std::cerr << "Error: Unable to unexport GPIO" << std::endl;
        return;
    }
    unexport_file << pin;
}

2. 设置 GPIO 引脚方向#

可以设置为输入(in)或输出(out):

void set_gpio_direction(int pin, const std::string& direction) {
    std::string direction_path = "/sys/class/gpio/gpio" + std::to_string(pin) + "/direction";
    std::ofstream direction_file(direction_path);
    if (!direction_file) {
        std::cerr << "Error: Unable to set GPIO direction" << std::endl;
        return;
    }
    direction_file << direction;
}

3. 写 GPIO 引脚#

将 GPIO 引脚设置为高电平(1)或低电平(0):

void write_gpio_value(int pin, int value) {
    std::string value_path = "/sys/class/gpio/gpio" + std::to_string(pin) + "/value";
    std::ofstream value_file(value_path);
    if (!value_file) {
        std::cerr << "Error: Unable to write GPIO value" << std::endl;
        return;
    }
    value_file << value;
}

4. 读 GPIO 引擎#

读取 GPIO 引脚的电平状态:

int read_gpio_value(int pin) {
    std::string value_path = "/sys/class/gpio/gpio" + std::to_string(pin) + "/value";
    std::ifstream value_file(value_path);
    if (!value_file) {
        std::cerr << "Error: Unable to read GPIO value" << std::endl;
        return -1;
    }
    int value;
    value_file >> value;
    return value;
}

完整示例代码#

以下是完整的示例代码,将所有步骤结合起来:

#include <iostream>
#include <fstream>
#include <string>
#include <unistd.h>

void export_gpio(int pin) {
    std::ofstream export_file("/sys/class/gpio/export");
    if (!export_file) {
        std::cerr << "Error: Unable to export GPIO" << std::endl;
        return;
    }
    export_file << pin;
}

void unexport_gpio(int pin) {
    std::ofstream unexport_file("/sys/class/gpio/unexport");
    if (!unexport_file) {
        std::cerr << "Error: Unable to unexport GPIO" << std::endl;
        return;
    }
    unexport_file << pin;
}

void set_gpio_direction(int pin, const std::string& direction) {
    std::string direction_path = "/sys/class/gpio/gpio" + std::to_string(pin) + "/direction";
    std::ofstream direction_file(direction_path);
    if (!direction_file) {
        std::cerr << "Error: Unable to set GPIO direction" << std::endl;
        return;
    }
    direction_file << direction;
}

void write_gpio_value(int pin, int value) {
    std::string value_path = "/sys/class/gpio/gpio" + std::to_string(pin) + "/value";
    std::ofstream value_file(value_path);
    if (!value_file) {
        std::cerr << "Error: Unable to write GPIO value" << std::endl;
        return;
    }
    value_file << value;
}

int read_gpio_value(int pin) {
    std::string value_path = "/sys/class/gpio/gpio" + std::to_string(pin) + "/value";
    std::ifstream value_file(value_path);
    if (!value_file) {
        std::cerr << "Error: Unable to read GPIO value" << std::endl;
        return -1;
    }
    int value;
    value_file >> value;
    return value;
}

int main() {
    int gpio_pin = 24;  // 使用的 GPIO 引脚编号

    export_gpio(gpio_pin);
    set_gpio_direction(gpio_pin, "out");

    // 写 GPIO 引脚为高电平
    write_gpio_value(gpio_pin, 1);
    sleep(1);  // 延时 1 秒

    // 写 GPIO 引脚为低电平
    write_gpio_value(gpio_pin, 0);
    sleep(1);  // 延时 1 秒

    set_gpio_direction(gpio_pin, "in");

    // 读取 GPIO 引脚电平
    int value = read_gpio_value(gpio_pin);
    std::cout << "GPIO Value: " << value << std::endl;

    unexport_gpio(gpio_pin);

    return 0;
}

说明#

  1. 导出和取消导出 GPIO 引脚:通过向 /sys/class/gpio/export/sys/class/gpio/unexport 文件写入 GPIO 引脚编号,实现对引脚的导出和取消导出。
  2. 设置 GPIO 引脚方向:向 /sys/class/gpio/gpioN/direction 文件写入 "in""out",设置引脚为输入或输出模式。
  3. 写 GPIO 引脚值:向 /sys/class/gpio/gpioN/value 文件写入 10,设置引脚为高电平或低电平。
  4. 读 GPIO 引脚值:从 /sys/class/gpio/gpioN/value 文件读取引脚的当前电平值。

通过这些步骤,可以在 Linux 系统上方便地使用 C++ 代码进行 GPIO 控制。需要注意的是,操作 GPIO 通常需要管理员权限,因此在运行程序时可能需要使用 sudo