Arduino的Serial.print(F(""))问题

    好久之前在编写项目产品的Arduino库代码时发现内存(SRAM)占用偏高,想了想我也没在类内定义多少成员变量啊,也没啥大的数组啥的,后来关闭DEBUG_PRINT功能后,内存占用一下子下来了,才一拍脑袋是调试打印的字符串占用了大量的SRAM,于是就探究了一下Arduino可执行文件的内存分布问题。

    和普通程序一样,Arduino的代码编译完成后也是分为code段、data段、bss段、noinit段,从最后编译输出窗口看,可以笼统的看做是代码段和数据段(包含全局变量和堆栈空间的占用),但是程序本身的大小是code段+data段,这就是占用FLASH的大小,而占用SRAM的就是data段+bss段+noinit段。


    再列出avr单片机的程序编译输出信息(与本文程序不是同一程序):

AVR Memory Usage
----------------
Device: atmega16

Program:   14362 bytes (87.7% Full)
(.text + .data + .bootloader)

Data:        635 bytes (62.0% Full)
(.data + .bss + .noinit)

    再上一张SRAM的内存分布图:




    回归主题,当我程序中的所有代码直接DEBUG_PRINTLN("")时


产生的程序文件大小是:


    当我把所有代码都写成这样:


输出的可执行文件大小:


可以得到的结论:添加 F() 相当于为字符串常量定义了PROGMEM属性,常量字符串仍然存储在FLASH中,但是程序运行时不会再将常量字符串从FLASH中copy到SRAM中,而是直接读取FLASH中的字符串,这样一来就节约了SRAM,但是代码运行速度就下降了。

    细心的童鞋会看到节约的SRAM大小并不是完全等于增加的FLASH大小,这是因为重复的字符串被FLASH只存储了一份,Arduino做的还是很人性化的,其他的类似xxduino库就没这么机智了,比如今天正在研究的WiFiduino(基于ESP8266模组做的 一个类似Arduino框架,用户可以像操作Arduino一样操作ESP8266,内含丰富的网络操作API):



  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Arduino中的serial.print指令是用来在串口监视器中输出调试信息或者与其他设备进行串口通信的命令。它可以将文本、数字、变量等输出到串口监视器中。 例如,如果你想要输出一个字符串 "Hello World",你可以使用以下代码: ``` Serial.begin(9600); // 初始化串口,波特率为9600 Serial.println("Hello World"); // 输出字符串到串口监视器 ``` 在串口监视器中将会看到 "Hello World" 的输出。 除了println,serial.print命令还有其他的输出格式选项,例如print、write、println等等,可以根据需要选择不同的输出方式。同时也可以使用不同的进制格式输出数字或变量,如十六进制、二进制等等。 需要注意的是,在使用serial.print命令之前,必须先初始化串口,使用Serial.begin命令设置波特率。否则,串口无法正常工作。 ### 回答2: ArduinoSerial.print函数是用来将变量的值通过串口发送给计算机。当我们想要调试 Arduino 程序时,可以使用 Serial.print 将变量的值打印到串口监视器中,以便我们可以查看变量的实时数值。 Serial.print函数可以操作多种数据类型,包括整数、浮点数和字符等。对于整数和浮点数,Serial.print会将它们转换为ASCII码,并逐个发送每个字符到串口。而对于字符类型的数据,Serial.print函数会直接发送字符的ASCII码。 Serial.print函数也支持将变量的值打印为不同的进制形式,如十六进制、八进制或二进制。我们只需要在函数中添加第二个参数,指定打印的进制即可。 使用Serial.print函数时,需要将Arduino与计算机通过USB线连接,并打开串口监视器。然后在代码中加入Serial.begin函数,用于初始化与计算机的通信,以及Serial.print函数来打印需要调试的变量值。 通过使用Serial.print函数,我们可以在开发和调试过程中更直观地了解程序运行的状态,以及各个变量的取值情况。这对于除错和优化代码非常有帮助,同时也方便我们对Arduino进行实时监控和响应。 ### 回答3: Arduino的`Serial.print()`函数是用来向串口发送数据的。该函数可以将数字、字符、字符串等不同类型的数据发送到计算机或其他设备。使用该函数可以方便地进行调试和数据传输。 函数的语法如下: ``` Serial.print(value); ``` 其中,`value`是要发送的数据。`value`可以是整型、浮点型、字符型或字符串型。函数会将`value`转换为字符并发送到串口。发送的字符会由串口连接的接收设备接收并解析。 使用`Serial.print()`函数有几个常见的用法: 1. 发送数字: ``` int num = 10; Serial.print(num); ``` 上述代码会将整数10发送到串口。 2. 发送浮点数: ``` float value = 3.14; Serial.print(value, 2); // 发送2位小数 ``` 上述代码会将浮点数3.14发送到串口,保留2位小数。 3. 发送字符: ``` char ch = 'A'; Serial.print(ch); ``` 上述代码会将字符'A'发送到串口。 4. 发送字符串: ``` String text = "Hello, world!"; Serial.print(text); ``` 上述代码会将字符串"Hello, world!"发送到串口。 需要注意的是,`Serial.print()`函数只能发送数据,无法接收数据。如果需要接收数据,可以使用`Serial.read()`函数。 总之,Arduino的`Serial.print()`函数是一个非常实用的函数,可以方便地向串口发送不同类型的数据,方便调试和数据传输。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值