Jetson AGX xavier nx 使用c++点灯gpio

为了确保无论是按 Ctrl+C 终止程序,还是程序自动退出时都能关闭所有的灯,你可以使用 signal 处理来捕捉 SIGINT 信号(即 Ctrl+C),同时结合 atexit 来在正常退出时关闭灯。

以下是修改后的代码,加入了对 SIGINT 信号的处理:

#include <iostream>
#include <fstream>
#include <string>
#include <thread>
#include <chrono>
#include <cstdlib>   // for system function
#include <csignal>   // for signal handling

// GPIO操作函数
void setGPIO(const std::string& gpio, const std::string& value) {
    std::ofstream valueFile("/sys/class/gpio/gpio" + gpio + "/value");
    if (valueFile.is_open()) {
        valueFile << value;
        valueFile.close();
        std::cout << "GPIO " << gpio << " set to " << value << std::endl;
    } else {
        std::cerr << "Unable to set value for GPIO " << gpio << std::endl;
    }
}

// 初始化GPIO
void initGPIOs() {
    // 先取消导出已导出的 GPIO
    system("echo \"290\" | sudo tee /sys/class/gpio/unexport");
    system("echo \"289\" | sudo tee /sys/class/gpio/unexport");
    system("echo \"291\" | sudo tee /sys/class/gpio/unexport");
    system("echo \"288\" | sudo tee /sys/class/gpio/unexport");

    // 导出 GPIO 并设置方向
    system("echo \"290\" | sudo tee /sys/class/gpio/export && \
            echo \"289\" | sudo tee /sys/class/gpio/export && \
            echo \"291\" | sudo tee /sys/class/gpio/export && \
            echo \"288\" | sudo tee /sys/class/gpio/export && \
            echo \"out\" | sudo tee /sys/class/gpio/gpio290/direction && \
            echo \"out\" | sudo tee /sys/class/gpio/gpio289/direction && \
            echo \"out\" | sudo tee /sys/class/gpio/gpio291/direction && \
            echo \"out\" | sudo tee /sys/class/gpio/gpio288/direction");

    std::cout << "GPIOs initialized" << std::endl;
}

// 关闭所有灯
void turnOffAllGPIOs() {
    setGPIO("290", "0");
    setGPIO("289", "0");
    setGPIO("291", "0");
    setGPIO("288", "0");
    std::cout << "All GPIOs turned off" << std::endl;
}

// 信号处理函数,用于捕捉 Ctrl+C (SIGINT)
void signalHandler(int signum) {
    std::cout << "Interrupt signal (" << signum << ") received.\n";
    turnOffAllGPIOs();
    exit(signum);
}

int main() {
    // 注册程序退出时的清理函数
    atexit(turnOffAllGPIOs);

    // 注册信号处理函数来捕捉 SIGINT (Ctrl+C)
    signal(SIGINT, signalHandler);

    // 初始化GPIO
    initGPIOs();

    // 定义要操作的GPIO编号
    std::string gpio290 = "290";
    std::string gpio289 = "289";
    std::string gpio291 = "291";
    std::string gpio288 = "288";

    try {
        while (true) {
            // 290和289轮流亮三秒
            setGPIO(gpio290, "1");
            setGPIO(gpio289, "0");
            std::this_thread::sleep_for(std::chrono::seconds(3));

            setGPIO(gpio290, "0");
            setGPIO(gpio289, "1");
            std::this_thread::sleep_for(std::chrono::seconds(3));

            // 291和288轮流亮三秒
            setGPIO(gpio291, "1");
            setGPIO(gpio288, "0");
            std::this_thread::sleep_for(std::chrono::seconds(3));

            setGPIO(gpio291, "0");
            setGPIO(gpio288, "1");
            std::this_thread::sleep_for(std::chrono::seconds(3));
        }
    } catch (...) {
        std::cerr << "An exception occurred, exiting..." << std::endl;
        turnOffAllGPIOs();
        throw; // rethrow the exception
    }

    return 0;
}

代码说明:

  1. signalHandler 函数:

    • 这个函数会捕捉 SIGINT 信号(通常是 Ctrl+C 触发),然后调用 turnOffAllGPIOs 来关闭所有的 GPIO 灯,最后退出程序。
  2. signal(SIGINT, signalHandler)

    • 这一行代码注册了 SIGINT 信号的处理函数。这样当用户按下 Ctrl+C 时,程序会调用 signalHandler,确保在退出前关闭灯。
  3. atexit(turnOffAllGPIOs)

    • 在程序正常退出时,这个函数会自动被调用,以关闭所有灯。
  4. 正常和异常情况下的退出:

    • 无论是通过 Ctrl+C 终止,还是程序由于异常退出,或者正常退出,所有 GPIO 灯都会被关闭。

通过这样的处理方式,可以确保在任何情况下,程序都能安全地关闭所有的 GPIO 灯,避免不必要的电力消耗或硬件损坏。

### NVIDIA AGX Orin 平台上的 GPIO 配置与使用 对于NVIDIA AGX Orin平台而言,在配置和使用GPIO接口前,需指定所使用的模式。这可以通过调用`GPIO.setmode()`函数来完成,该函数接受参数以设定不同的引脚编号方式[^1]。 在AGX Orin平台上支持多种模式设置: - `GPIO.BCM`: 使用BCM芯片引脚编号。 - `GPIO.BOARD`: 使用P1连接器物理引脚编号。 - `GPIO.CVM`: 特定于Jetson Nano Developer Kit载板的引脚定义。 - `GPIO.TEGRA_SOC`: Tegra SoC专用命名方案,适用于包括AGX Orin在内的Tegra系列设备。 为了确保程序兼容性和稳定性,推荐采用`TEGRA_SOC`作为模式选项,因为这是专门为Tegra处理器设计的方式,能够更好地映射到实际硬件资源上。 下面是一个简单的Python代码片段用于初始化并控制一个LED灯通过GPIO口操作: ```python import Jetson.GPIO as GPIO import time # 设置GPIO模式为TEGRA_SOC GPIO.setmode(GPIO.TEGRA_SOC) # 定义要使用的具体GPIO通道号(这里假设是38) led_channel = 'DAP4_SCLK' try: # 将选定的GPIO通道设为输出方向 GPIO.setup(led_channel, GPIO.OUT) while True: # 输出高电平使LED亮起 GPIO.output(led_channel, GPIO.HIGH) time.sleep(1) # 延迟一秒 # 输出低电平关闭LED GPIO.output(led_channel, GPIO.LOW) time.sleep(1) finally: # 清理释放所有已分配给此进程的资源 GPIO.cleanup() ``` 这段代码展示了如何利用Jetson.GPIO库来进行基本的操作,比如点亮/熄灭一个外部接线至特定GPIO端子上的LED指示灯。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无证驾驶梁嗖嗖

让我们解决Jetson使用问题

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值