首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用pigpio正确地改变变量?

如何用pigpio正确地改变变量?
EN

Stack Overflow用户
提问于 2021-11-09 09:43:01
回答 1查看 90关注 0票数 1

我想监控一个特定的GPIO引脚,它有一个按钮连接到它,并取决于按钮被按下的次数,它将打开一些LED灯,使他们眨眼或关闭他们。

代码语言:javascript
复制
#include <stdio.h>
#include <pigpio.h>
#include <stdlib.h>
#include <unistd.h>

#define LED_1 13
#define LED_2 19
#define BUTTON 25
#define ON 1
#define OFF 0
#define DELAY 1

void initalise_pins();
void clear_all();
void start_button();
void turn_on_lights();
void increment_state(int gpio, int level, uint32_t tick);


int current_state = 0; /*Don't have a better way of breaking out of loop during pulse so using global var*/

int main(){
    if (gpioInitialise() < 0){
        printf("Error initializing pigpio library, exiting");
    }
    else{
        initalise_pins();
        clear_all();
        start_button();
    }
}

int main(){
    initalise_pins();
    clear_all();
    start_button();
}

void initalise_pins(){
    gpioSetMode(LED_1, PI_OUTPUT); /*Set LED at pin 13 to output*/
    gpioSetMode(LED_2, PI_OUTPUT); /*Set LED at pin 19 to output*/
    gpioSetMode(BUTTON, PI_INPUT); /*Set Button at pin 25 to input*/
    gpioSetPullUpDown(BUTTON, PI_PUD_DOWN); /*Set Button at pin 25 to pulldown*/
    gpioSetAlertFunc(BUTTON, increment_state); /*Function to watch for GPIO state change*/
}

void clear_all(){
    gpioWrite(LED_1, OFF); /*Resets LED_1 to off*/
    gpioWrite(LED_2, OFF); /*Resets LED_2 to off*/
}

void turn_on_lights(){
    gpioWrite(LED_1, ON);
    gpioWrite(LED_2, ON);
}

void increment_state(int gpio, int level, uint32_t tick){
    if (level == 1){
        current_state += 1;
    }
}

void start_button(){
    for (;;){ /*Loop to keep reading button value*/
        if (current_state == 0){ /*Current state off*/
            continue;
        }
        else if (current_state == 1){ /*Current state on*/
            turn_on_lights();
        }
        else if (current_state == 2){ /*Current state blinking*/
            clear_all();
            sleep(DELAY);
            turn_on_lights();
            sleep(DELAY);
        }
        else{ /*Reset state to off*/
            clear_all();
            current_state = 0;
        }
        sleep(0.1);
    }
}

代码按预期工作,但是否有适当的方法来设置current_state的值,而不是将其作为全局变量?这个解决方案的主要问题是,当我将它编译为Python中使用的库时,这个函数就会中断。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-09 10:00:26

据我所知,有三种方法可以存储“超出其范围”的数据。

一个全局变量--如您所知,这个变量在所有调用中都是共享的,即使在编译单元之外也可以引用。calls.

  • Parameters,

  • A static变量--这种类型仅限于它定义的范围,从外部无法访问,但在传递给您的函数的所有

  • 之间再次共享。

按照我对您的问题的理解,您不希望在调用的所有实例中共享变量的值,这会自动取消1和2的资格。

因此,您需要从外部将所需的信息传递到您的函数中。

虽然您可以将current_state_id传递到函数集“原样”,但这要求库的用户了解库的工作方式。

一个更好的解决方案是上下文结构,它隐藏了所需数据的内部,并使您可以灵活地从内部添加/删除数据,而不必担心更改API。

一个正常的方法应该是这样的:

代码语言:javascript
复制
struct _PIN_Ctrl; //Forward declaration of the (opaque) structure.
typedef struct _PIN_Ctrl *PIN_Ctrl;

PIN_Ctrl createPINCtrl(void);
//Any number of functions taking PINCtrl as context structure.
freePINCtrl(PIN_Ctrl ctrl);

调用将类似地工作(现在使用C99符号):

代码语言:javascript
复制
if (PIN_Ctrl ctrl = createPINCtrl())
{
    //doStuffWithYourContext
    freePINCtrl(ctrl);
}

createPINCtrl需要将您的结构初始化为malloc,并将其成员初始化为已定义的状态(即“currentState”到0)。在内部,您将自然地访问结构的成员,最后'freePINCtrl‘只是执行free(ctrl)来清理分配的内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69895907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档