Arduino Timer库和void指针

时间:2015-10-07 14:17:42

标签: c pointers timer arduino

我使用此计时器库:https://github.com/JChristensen/Timer/tree/v2.1

代码示例:

int afterEvent = t.after(10000, doAfter, (void*)0);

void doAfter(void *context)
{
    Serial.println("stop the led event");
    t.stop(MyledEvent);
}

文档:

  
    

上下文是一个void指针,因此可以转换为任何其他数据     类型。它的使用是可选的,如果你不需要它,只需代码(void *)0 as     在上面的例子中,但要确保回调函数     定义在他们的参数列表中有它

  
     

int8_t after(unsigned long duration,void( callback)(void ),void *   上下文);

我需要在“afterEvent”中加入一个参数(在“doAfter”中使用未来),我不明白该怎么做。你能解释我如何在这个“doAfter”上做一个参数列表以及如何把论点放在“t.after”上?

我的测试:

int afterEvent = t.after(10000, doAfter(5), (void*)0);

void doAfter(int x, void *context)     { ..code... }

错误:

  

错误:声明'int type'会影响参数

     

错误:函数'void doAfter(int,void *)'的参数错误:太少

由于

1 个答案:

答案 0 :(得分:1)

如果你的函数需要任何参数,那么它们需要通过上下文指针传递,这就是它的用途。所以一个简单的例子如下:

void doAfter(void *my_param) {
     int x = *(int *)my_param;

     ..... your code here ...

}

然后打电话给你,你只会做

const int input_param = 5;
int afterEvent = t.after(10000, doAfter, (void *)&input_param);

如果您需要传递多个参数,那么可以使用结构:

struct param_list {
     int param1;
     double param2;
};

void doAfter2(void *context)
{
      struct param_list *params = context;

      .... code here can access params with params-> ..

}

struct param_list p = {1, 2.0};
int afterEvent = t.after(10000, doAfter2, (void *)&p);