Enumeration--枚举:容器,只能装常量,不会发生改变的量。对值进行命名的方法
Enumerator--枚举器
Enum--枚举的缩写

采用::对枚举成员进行访问
采用枚举进行点灯示例

LedCmd cmd = static_cast
采用byte定义数据类型,可以节省内存空间,byte范围0~255,1个字节
- #include
- // enum 声明
- // 默认使用整数类型,占用2个字节
- // 改成unsigned char或者 byte,只占用1个字节
- enum class LedCmd
- {
- On,
- Off,
- Flash
- };
-
- // 定义一个数组,存放需要点亮灯的pin
- const byte ledpins[] = {4, 5, 6, 7, 8, 9};
- const byte ledpins_size = sizeof(ledpins) / sizeof(ledpins[0]);
-
- void showmenu(); // 函数声明--串口打印菜单界面
- void ledon(const byte &pin); // 开灯
- void ledoff(const byte &pin); // 关灯
- void ledflash(const byte &pin); // 闪烁
-
- void setup()
- {
- Serial.begin(9600);
- Serial.setTimeout(300); // 串口运行时间
- while (!Serial)
- {
- } //等待串口连接
-
- // 定义端口号为输出
- for (byte i = 0; i < ledpins_size; i++)
- pinMode(ledpins[i], OUTPUT);
- showmenu(); // 向串口打印命令菜单
- }
-
- void loop()
- {
- // 等待用户输入命令
- while (Serial.available())
- {
- // 用户输入放进input中
- byte input = Serial.parseInt(); // 读取一个整数,返回值为整数
- Serial.println(String(input));
- // 初始化一个新的LedMenu enum类型的对象 cmd
- // 并将input字节转换成对应的LedMenu enum值
- LedCmd cmd = static_cast
(input); // static_cast功能:把一个表达式转换成某种类型 - Serial.println("cmd enum内存占用-" + String(sizeof(cmd)) + "字节");
- switch (cmd)
- {
- case LedCmd::On:
- ledon(ledpins, ledpins_size); //开灯程序
- break;
- }
- }
- }
-
- void ledon(const byte *pins, const byte pinsize)
- {
- for (byte i = 0; i < pinsize; i++)
- digitalWrite(pins[i], LOW);
- }
主要是为了节省空间,1个字节8位
位域的方式分配空间只能用在结构体和类中

- // 进行位域划分,一个int为2个字节,16bit
- // 使用方法,在变量名后加一个:即可
- struct Date{
- int year:12; //分配12个bit
- int month:4; // 分配4个字节
- int day:5; // ....
- int hour:5;
- int minute:6;
- int second:6;
- };
结构体和联合体的区别:内存占用方式不一样
结构体:内存独享
联合体:内存共享,可以节省内存空间

- union Data
- {
- byte b; // 1 byte
- int i; // 2 bytes
- long l; // 4 bytes
- char str[14]; // 14 bytes
- };
- // 当四个变量不同时使用时,占用空间14 bytes
- // 当4个变量同时使用,数据会出错
- Data data;
主要作用:进行封装
结构体和类的区别:
类:所有的成员只对内开放,内外访问有限制。
结构体:开放

- class Ledflash
- {
- public:
- ledflash(); // 构造函数
- void init();
- void on();
- void off();
-
- private:
- byte _pin = 13; // _代表私有
- };
-
- Ledflash::ledflash(byte pin ){
- _pin = pin;
- }
-
- void Ledflash::init(){
- pinMode(_pin, OUTPUT);
- }