arduino中 #define、const和int 的差别

首选我们要了解到的一个信息是arduino板子上的两个参数SRAM:2KB,Flash:32KB;

对应到我们使用的电脑呢,你可以认为SRAM是我们的内存,而Flash由是硬盘。先把这个理解清楚。

#define 和 const 的区别
#define就像一个占位符。Arduino 编译器在编译时用它的值替换所有提到的这个常量。这意味着使用#define定义的值不占用任何程序空间。

另一方面,使用const定义的变量只是普通变量,其值无法更改。它们占用程序内存空间,并具有类型(这在许多情况下是有利的)。

通常,最好使用const 而不是#define来定义常量

int 与 #define的区别

int ledPin 13;

这句的意思是从内存中分配一块8位的内存,并将这块内存中的值设置成13,将这块内存命名成ledPin。

#define LED 13;

这句话的意思是,为13设置一个别名,叫LED,以后所有使用LED这个词语的时候,实际使用的就是13.但在程序运行时,并不会为这个LED分配内存,因为他并不存在。

那么具体他们有什么差别呢?

1.int ledPin 13;这句代码在内存中是有固定位置用来存储的,在程序运行的时候是可以修改13这个值的。

而#define LED 13;则是在内存中没有位置存储,程序运行时候是不可以修改的。

所以可以说,int ledPin 13;在运行更灵活。

那既然更灵活,为什么我们还会有#define LED 13;的代码在使用呢,难到有人不想更灵活?

这就用到我们刚开始说的那个SRAM:2KB了,我们的程序在运行时,一共只有2KB的空间可以用来存储运算数据,如果我们写议了很多类似的int型代码,则有可能会出现内存不足的现像,大家可以试试定议一个大的数据看看这个现像 例如 int led_list[2500];你的程序即使能编译通过,也是无法在大多数arduino板子上运行的,因为内存空间的不足。所以我们在写代码的时候要尽可能的节约对SRAM的使用,这就出现了#define LED 13;这种写法了。

另外,还可以告诉大家的是

用int ledPin 13;与 #define LED 13;在使用digitalWrite的时候,使用#define LED 13;会更快一点,虽然只是一点点,但相对比较起来,可能就有很大不同了。

大家可以用些代码来测量一下,例如:

//下面的代码我没测试过,如果看不出差距,可以将那个20000再调大一点。

#define LED 13

int ledPin 13;

void setup()

{
Serial.begin(9600);

}

void loop()

{
unsigned long start1,start2,end1,end2;

int i,tag=0;

start1=millis();

for(i=0;i<20000;i++)

{
digitalWrite(LED, tag);

tag=!tag;

}

end1=millis();

start2=millis();

for(i=0;i<20000;i++)

{
digitalWrite(ledPin , tag);

tag=!tag;

}

end2=millis();

Serial.println(end1-start1);

Serial.println(end2-start2);

}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是改进后的代码: ```cpp #include <DHT.h> #include <SoftwareSerial.h> #define TJC_RX 15 // Arduino的软串口RX接口 #define TJC_TX 14 // Arduino的软串口TX接口 #define TJC_BAUD 9600 // 串口波特率 #define DHTPIN A0 //定义针脚 #define DHTTYPE DHT11 //定义类型,DHT11或者其它 DHT dht(DHTPIN, DHTTYPE); SoftwareSerial TJC(TJC_RX, TJC_TX); unsigned long lastTime = 0; const unsigned long interval = 1000; // 1s 的时间间隔 void setup() { Serial.begin(9600); //初始化串口 TJC.begin(TJC_BAUD); //初始化串口屏 while (TJC.read() >= 0); //清空串口缓冲区 TJC.print("page main\xff\xff\xff"); //发送命令让屏幕跳转到main页面 lastTime = millis(); //获取当前已经运行的时间 } void loop() { // 每隔 interval 毫秒执行一次 if (millis() - lastTime < interval) { return; } lastTime = millis(); // 读温度或湿度要用250毫秒 float h = dht.readHumidity(); //读湿度 float t = dht.readTemperature(); //读温度,默认为摄氏度 Serial.print("Humidity: "); //湿度 Serial.println(h); Serial.print("Temperature: "); //温度 Serial.print(t); Serial.println(" ℃"); // 用 sprintf 来格式化字符串,给 t0 的 txt 属性赋值 char str[100]; sprintf(str, "t0.txt=\"Temperature: %.2f ℃\"\xff\xff\xff", t); // 把字符串发送出去 TJC.print(str); } ``` 主要的改进如下: 1. 将串口的初始化放在 Serial.begin() 函数,避免混淆。 2. 通过 lastTime 和 interval 变量来控制每隔一定时间执行一次温度读取和屏幕更新操作,避免了使用 delay() 函数造成的程序响应速度降低的问题。 3. 在温度字符串的格式化,将温度值 t 直接嵌入到字符串,避免了使用未定义的变量 a。 4. 去掉了无用的头文件包含,缩短了编译时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值