Arduino代码机制-Arduino.h

本文探讨了Arduino.h头文件中的宏定义,包括常数、输出端口和Flash读取宏,以及类似函数的宏。文章指出,如min、max这类宏虽然外观类似函数,但实际上不进行类型检查,可能带来安全隐患。通过示例,解释了宏在特定情况下能确保安全,并在某些场景下比函数更高效。此外,还提到了头文件中申明的真实函数,如数值映射函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚看到前两天写的博客竟然有两个人看了,还是很激动的,如果有评论那就更好啦。
这个头文件做的事情非常多,定义了一些常数,还定义了一些“函数”,申明了一些常用函数。

宏定义常数

一些常用常数和设置

在注释中给出解释

#define HIGH 0x1//定义高低电平,对引脚读写时用到
#define LOW  0x0//digitalWrite函数会用到

#define INPUT 0x0//设置引脚模式,输入
#define OUTPUT 0x1//输出
#define INPUT_PULLUP 0x2//输入上拉,pinMode函数
//一些常用常数
#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398
#define TWO_PI 6.283185307179586476925286766559
#define DEG_TO_RAD 0.017453292519943295769236907684886
#define RAD_TO_DEG 57.295779513082320876798154814105
#define EULER 2.718281828459045235360287471352
//串口通信中的设置,设置传输数据是高位在前还是低位在前
#define LSBFIRST 0
#define MSBFIRST 1
//外部中断模式
#define CHANGE 1//电平改变触发方式
#define FALLING 2//下降沿触发
#define RISING 3//上升沿触发

定义输出端口和读取Flash的宏

上一篇博客讲到啦就不说了

宏定义“函数”

贴代码,这些看起来像函数的东西可不是函数啊,注意咯

#define min(a,b) ((a)<(b)?(a):(
### 关于ESP-NOW.h库的使用 #### 1. 安装ESP32开发板支持 为了在Arduino IDE中使用`ESP-NOW.h`库,首先需要确保已正确安装ESP32开发板的支持。按照提供的资料[^1],打开Arduino IDE并进入工具菜单下的“Board Manager”。在此处搜索关键词“ESP32”,找到由乐鑫官方发布的ESP32开发板包,并完成安装。 #### 2. 配置ESP-NOW功能 ESP-NOW是一种低功耗、快速响应的数据传输协议,适用于短距离无线通信场景。其核心在于通过Wi-Fi芯片实现设备间数据交换而不依赖传统网络连接。要启用此功能,在代码初始化阶段需调用如下函数: ```cpp #include <WiFi.h> #include <esp_now.h> // 初始化ESP-NOW void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); // 设置模式为STA if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } } ``` 上述代码片段展示了如何启动ESP-NOW模块。如果初始化失败,则会打印错误消息至串口监视器[^2]。 #### 3. 数据发送与接收机制 利用ESP-NOW可以轻松构建点对点(Peer-to-Peer)或者一对多(Master-Slave)架构的应用程序。下面分别描述两种主要操作——发送和接收数据的方法。 ##### 发送端设置 定义目标MAC地址用于指定接收方的身份标识符。随后注册回调函数处理状态更新事件。 ```cpp uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; bool sendStatus; // 注册发送成功/失败后的回调方法 esp_now_register_send_cb(onSend); // 构建结构体存储待传信息 struct __attribute__((packed)) myDataStruct{ int value; }; myDataStruct dataToSend; dataToSend.value = 42; sendStatus = esp_now_send(broadcastAddress, (uint8_t *) &dataToSend, sizeof(dataToSend)); if(sendStatus){ Serial.println("Message sent successfully"); } else { Serial.println("Failed to send message"); } void onSend(const uint8_t *mac_addr, esp_now_send_status_t status) { Serial.print("\r\nLast Packet Send Status:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); } ``` 此处需要注意的是,当广播地址设为全FF时表示向所有监听该信道的节点散发消息;反之则仅针对特定单一装置通讯[^3]。 ##### 接收端配置 同样也需要设定相应的回调逻辑以便及时捕获到来的信息流。 ```cpp struct __attribute__((packed)) receivedDataStruct{ int value; }; receivedDataStruct incomingData; void onDataReceived(const uint8_t * mac, const uint8_t *incomingData, int len) { memcpy(&incomingData, incomingData, sizeof(incomingData)); Serial.printf("Bytes received: %d", len); Serial.printf(", Value: %d\r\n", incomingData.value); } esp_now_register_recv_cb(onDataReceived); ``` 以上部分实现了基础框架下简单的数值传递演示案例。实际项目里可根据需求扩展更复杂的消息格式设计以及增强型差错校验算法等附加特性。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值