首页 > 解决方案 > C++ 程序问题:在抛出 'std::invalid_argument' 的实例后调用终止

问题描述

我开发了一个代码,我试图用它来通过我的 SAMA5D27 嵌入式板上的用户按钮 (PIN 29) 来操纵红色 LED (PIN 10)。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "/home/gaston/linux4sam/poky/build-microchip/tmp/sysroots-components/cortexa5hf-neon/mraa/usr/include/mraa.hpp"

#define red 10
#define USER 29

bool running = true;
bool led_state = false;
int last_touch;
void sig_handler(int signo)
{
    if (signo == SIGINT)
        running = false;
}

int main(int argc, char* argv[])
{
    mraa::Result ret;
    int touch;

    mraa::Gpio* touch_gpio = new mraa::Gpio(USER);
    if (touch_gpio == NULL){
        return mraa::ERROR_UNSPECIFIED;
    }
    mraa::Gpio* led_gpio = new mraa::Gpio(red);
    if (led_gpio == NULL){
        return mraa::ERROR_UNSPECIFIED;
    }

    signal(SIGINT, sig_handler);

    if ((ret = touch_gpio->dir(mraa::DIR_IN))!= mraa::SUCCESS){
        return ret;
    }
    if ((ret = led_gpio->dir(mraa::DIR_OUT))!= mraa::SUCCESS){
        return ret;
    }

    led_gpio->write(led_state);
   
    while (running) {
        touch = touch_gpio->read();
        if (touch == 1 && last_touch == 0) {
            led_state = !led_state;
            ret = led_gpio->write(led_state);
            usleep(100000);
        }
        last_touch = touch;
        usleep(1);
    }
    delete led_gpio;
    delete touch_gpio;
    return ret;
}

编译后我尝试执行代码,但它显示了这条消息:

在抛出 'std::invalid_argument' 的实例后调用终止

what():指定的 GPIO 引脚无效

中止

这是怎么回事,我该如何解决这个问题?

标签: c++

解决方案


可能这条线有问题:

mraa::Gpio* touch_gpio = new mraa::Gpio(USER);

您的 Rasberry Pi 没有 29 作为密码。检查 Rasberry Pi 版本的文档。它不是引脚编号,而是 GPIO 编号。


推荐阅读