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;
}
说明#
- 导出和取消导出 GPIO 引脚:通过向
/sys/class/gpio/export和/sys/class/gpio/unexport文件写入 GPIO 引脚编号,实现对引脚的导出和取消导出。 - 设置 GPIO 引脚方向:向
/sys/class/gpio/gpioN/direction文件写入"in"或"out",设置引脚为输入或输出模式。 - 写 GPIO 引脚值:向
/sys/class/gpio/gpioN/value文件写入1或0,设置引脚为高电平或低电平。 - 读 GPIO 引脚值:从
/sys/class/gpio/gpioN/value文件读取引脚的当前电平值。
通过这些步骤,可以在 Linux 系统上方便地使用 C++ 代码进行 GPIO 控制。需要注意的是,操作 GPIO 通常需要管理员权限,因此在运行程序时可能需要使用 sudo。