我有以下功能blinkLed
uint8_t status_led_pin = 4;
unsigned long long *previous_blink = 0;
uint8_t *led_state = 0;
void setup() {
pinMode (status_led_pin, OUTPUT);
digitalWrite(status_led_pin,0);
}
void loop() {
while(millis() <= 10000){
blinkLed(status_led_pin,&led_state,1000,&previous_blink);
}
digitalWrite(status_led_pin,0);
}
void blinkLed(uint8_t led, uint8_t *led_state, unsigned long long interval, unsigned long long *last_blink_millis){
unsigned long long now = millis();
if((now - *last_blink_mills) >= interval){
*last_blink_millis = now;
*led_state = !*led_state;
digitalWrite(led,*led_state);
}
}
当我调用digitalWrite函数时引发的错误:
无法将参数"2"的"uint8_t**{aka unsigned char**}"转换为"uint8 _t*{又名unsigned char*}",以将其转换为"void blinkLed(uint8_t,uint8_*,long long unsignedint,long long unsignatedint*(">
知道吗?
您忽略了正在使用指针。此外,从错误消息来看,digitalWrite
的原型似乎是:
void digitalWrite(char, char);
所以代码应该是:
void blinkLed(uint8_t led, uint8_t *led_state, int interval, unsigned long long *last_blink_millis){
unsigned long long now = millis();
if((int)(now - *last_blink_mills) >= interval){
*last_blink_millis = now;
*led_state = !*led_state;
digitalWrite(led,*led_state);
}
}
更改声明
unsigned long long *previous_blink = 0;
uint8_t *led_state = 0;
至
unsigned long long previous_blink = 0;
uint8_t led_state = 0;
您希望previous_blink
和led_state
存储类型为unsigned long long
和uint8_t
的值。当您将它们从loop
传递给blinkled
时,您希望blinkled
更新这些对象,因此您必须将指针传递给这些对象。
请记住,C通过值传递所有函数参数,这意味着函数定义中的形式参数是内存中与函数调用中的实际参数分离的对象。因此,要更新参数,我们必须传递一个指针:
void update( T *ptr ) // for any type T
{
*ptr = new_value(); // write a new value to the thing ptr points to
}
void call( void )
{
T val; // val is an object of type T
update( &val ); // pass a pointer to val to update
}
digitalWrite()
按值取value
,而不是按指针取,所以应该是
digitalWrite(led,*led_state);
你忘记了代码中到处都是引用。线路
led_state = !led_state;
不会产生错误,因为它是合法的,但它是一个巨大的错误。在该指针之后,如果led_state
不是null,则它是null指针。我相信你的意思是
*led_state = !(*led_state);
此外,还不清楚您期望的是什么,因为文档中没有任何内容允许向digitalWrite
提供任意值,只有HIGH和LOW。不确定它们等于什么,如果LOW为0,那么您就可以了,否则上面的行将导致零写入led_state
提供的常见样式文档有:
if(*led_state)
digitalWrite(led,HIGH);
else
digitalWrite(led,LOW);