我应该使用哪种变量类型来存储Arduino引脚状态?

时间:2019-04-23 18:04:17

标签: c++ arduino

Arduino文档为数字I / O引脚定义了常量HIGHLOW,但未指定其含义。因此,如果我想将引脚状态存储在变量中,则该变量应为哪种类型?逻辑假设是1变量中的0int,或者true中的falsebool,但是我可以在任何地方都找不到这个说法。

3 个答案:

答案 0 :(得分:2)

根据digitalRead()(返回HIGHLOW的文档),该值存储在int中,因此使用int似乎是一个安全的赌注。

函数digitalWrite()将引脚状态(HIGHLOW)作为参数,然后在the GitHub repositories from Arduino中搜索该函数的定义,有三种不同的定义定义:

void digitalWrite(uint32_t, uint32_t);
void digitalWrite(uint8_t, uint8_t);
void digitalWrite(pin_size_t, PinStatus);

PinStatus是一个枚举:

typedef enum {
  LOW     = 0,
  HIGH    = 1,
  CHANGE  = 2,
  FALLING = 3,
  RISING  = 4,
} PinStatus;

但是HIGHLOW始终被定义为10,它们可以绝对存储在int中(并可以转换为这三种类型)< / p>

答案 1 :(得分:1)

似乎您可以使用整数作为存储空间来驱动digitalWrite,而不是按照这篇文章的HIGH和LOW:http://forum.arduino.cc/index.php?topic=111711.0

-我尚未对此进行测试,因此请在接受之前进行验证。

答案 2 :(得分:0)

一种看待它的方式是Arduino的人们发明了HIGHLOW枚举器(宏?)来掩盖这样一个事实,即尽管有可能,但可能会有一个处理器不t将HIGH使用1,将LOW使用0。如果您想编写可移植的,面向未来的代码,则可能应该坚持使用HIGHLOW

另一种看待它的方式是,您(可能)并不真正在乎实际的引脚状态是什么;您会在意它的含义:按下按钮,运动传感器检测到有人,控制杆已放下等。您可以用对您有意义的任何形式(例如bool)存储含义,并在您的概念类型和越过边界的固定状态:

bool button_pressed = digitalRead(button_pin) == LOW;
...
digitalWrite(led_pin, button_pressed ? HIGH : LOW);

这里不要过分担心多余的代码,因为如果一切都具有“显而易见的”值和类型,则编译器将对其进行优化。

这又是一个嵌入式系统,其普遍性通常是大小和速度的次要问题。  对于嵌入式系统,您通常会确切知道要编写的硬件。如果您需要从中获取所有性能的信息,那么您可能不得不放弃使用漂亮的digitalRead / digitalWrite API,而直接使用处理器的寄存器。没关系。