
Arduino可以说是电子DIY玩家的宠儿,凭借其强大的开源社区与足够简单的编程特性,成为业余玩家特别是新手的不二之选。如果你想入坑电机DIY去恐惧于硬件知识,如果你想做出好玩有趣的项目却因时间,精力有限而无力学习专业知识,那么Arduino是你的最佳搭档。
Serial(串口通讯)可以让使用Arduino IDE编程的开发板与电脑通讯。
EEPROM(非易失性存储器)则可以“永久”保存数据(即在开发板断电后依然保存数据)。
这篇专栏就向大家介绍这两个库的函数用法。
Serial库可以让使用Arduino IDE编程的开发板与电脑通讯,对于程序调试,模块测试至关重要,是每个Arduino玩家的必学库。
EEPROM库提供了一个易于使用的接口,用于与基于 AVR 的 Arduino 板中的内部非易失性存储器进行交互,在Arduno项目中非常常见。该库适用于许多 AVR 设备,如 ATtiny 和 ATmega 芯片。
详情请见:
https://github.com/arduino/ArduinoCore-avr/tree/master/libraries/EEPROM
https://docs.arduino.cc/language-reference/en/functions/communication/serial/
温馨提示:Arduino IDE自带Serial和EEPROM库,Arduino旗下的开发板(例如Arduino Uno,Arduino Nano,Arduino Mega)内置相关的硬件电路。本专栏采用Arduino Uno作为示例,故无需下载库,无需电路连接,因此准备工作部分省略。Arduino Uno,Arduino Nano的Serial通讯引脚为0,1号引脚,进行Serial通讯时这两个应交将被占用。
Serial
1.begin(long speed)
功能:设置串行数据传输的比特率(波特率)。
参数:speed表示比特率。若要与Arduino IDE自带的串行监视器通信,须确保speed的值为屏幕右下角菜单中列出的波特率之一。
2.print(val, format)
功能:将数据以字符形式写入到串行发送缓冲区并打印。同时该函数会返回写入的字节数(该返回值可不使用)
参数:val表示打印的值,可为任何数据类型。format表示整数数据的格式或者浮点类型的小数位数,该参数可不填。对于整数数据默认为十进制,填入BIN(二进制),OCT(八进制),DEC(十进制),HEX(十六进制)表示以指定的进制输出。对于浮点数默认保留两位小数,可填入数字(0,1,2等)表示保留几位小数输出。
3.println(val, format)
功能:将数据以字符形式写入到串行发送收缓冲区并打印且换行。同时该函数会返回写入的字节数(该返回值可不使用)
参数:同print(val, format)
4.available()
功能:返回存储在串行接收缓冲区(可容纳 64 个字节)中数据的个数。
参数:无
5.read()
功能:从串行接收缓冲区取出第一个数据并返回对应的ASCII码(类型为int)。
参数:无
6.readString()
功能:从串行接收缓冲区取出字符到一个字符串中并返回。
参数:无
EEPROM
1.uint8_t read(int address)
功能:从 EEPROM 读取单个字节的数据并返回
参数:address为读取数据地址的指针
2.void write(int address, uint8_t value)
功能:将单个字节的数据(0~255)写入 EEPROM
参数:address表示写入数据地址的指针,value表示写入的数据
3.void update(int address, uint8_t value)
功能:当写入的单个字节数据(0~255)与上一次不同时,写入单个字节数据
参数:address表示写入数据地址的指针,value表示写入的数据
4.put(int address, value)
功能:将任何对象写入 EEPROM(只有在与上一次写入的值不同时写入)
参数:address表示写入对象地址的指针,value表示写入的对象
5.get(int address, value)
功能:读取由put()函数写入的对象并返回给value
参数:address, value,其中address表示读取对象地址的指针
6.uint16_t length()
功能:返回当前开发板EEPROM的长度(即EEPROM的大小)
参数:无
温馨提示:Arduino Uno,Arduino Nano开发板的EEPROM大小为1024bit。若使用Uno或者Nano板,则上述函数的address的范围为(0 ~ 1023)。若不确定自己手中的Arduino开发板EEPROM大小,可运行示例代码的“EEPROM大小获取”获取EEPROM的长度,即address的范围为(0~EEPROM的大小-1)
Serial
1.打印文本

连接开发板上传程序之后,点击右上角的“串口监视器”即可

可以看到屏幕上循环打印文本。
温馨提示:begin()函数里的参数Speed必须与串口监视器上的波特率保持一致,即图中圈起来的部分。
2.读取数据(read()函数)


在输入栏输入OAO,按下Enter键

可以看到屏幕上依此打印OAO
readString()函数


在输入栏输入OAO,按下Enter键

可以看到屏幕上字符串打印OAO
3.开发板与开发版之间通讯(以Uno和Nano的通讯为例)
接线如下
Uno NANO
TX ------->RX0
RX-------->TX1
GND------>GND
温馨提示:这里两块板的TX,RX引脚一定要交叉连接。(UP因为没有交叉连接弄坏了一块Nano板,也不知道还能不能救回来)上传程序时须断开TX,RX引脚的连接,防止干扰。
发送端程序

接收端程序

分别上传接收端与发送端程序
Nano为发送端

Uno为接收端

最后进行电路连接,即两块板的TX,RX引脚交叉连接,GND接GND。此时按下Nano上的复位按键即可向Uno发送数据,可以看到Uno板上自带的LED灯先点亮后熄灭。

EEPROM
1.EEPROM大小获取


可以看到Arduino Uno的EEPROM大小为1024,与前面一致。
2.数据的写入,读取(read(), write(), update())
我们先向地址0,1写入数据

上传程序后,我们移除开发板的数据线。

接着再接上数据线,上传如下程序读取数据

发现屏幕上打印的数据正是之前我们写入的数据

以下这段程序是update()函数的功能

运行可见

3.多字节数据存入,读取(put(), get())
写入

读取

运行看看

非常完美!!!可以发现这两个函数是制作具备记忆功能遥控器项目的基石。
温馨提示:
1.EEPROM的寿命有限,每次写入都会损耗EEPROM的寿命(大约可写入10万次),因此对于写入单个数据来说,能用update()函数就绝不用write()函数,以延长EEPROM寿命。
2.使用put()函数写入多个数据时必须确保数据间的地址满足下列式子,否则多个数据间会相互干扰,导致数据失真(别问UP是怎么知道的)
(后一个数据的写入地址 >= 前一个数据的写入地址 + 前一个数据类型所占字节 + 1)
是不是有点难懂?来让我们举个例子。
unsigned long irCode = 0xFF00FF ;
int num = 11415;
以上是两个变量,我们想用put()函数把这个两个数据写入EEPROM
假设先在地址0写入变量irCode,该变量的数据类型为unsigned long在Arduino Uno板中占4个字节,代入上面式子可得,num变量的写入地址 >= 0 + 4 + 1,即num变量的写入地址至少为5。
EEPROM.put(0, irCode);
EEPROM.put(5, num);
反过来先在地址0写入变量num,该变量的数据类型为int在Arduino Uno板中占2个字节,代入上面式子可得,irCode变量的写入地址 >= 0 + 2 + 1,即irCode变量的写入地址至少为3。
EEPROM.put(0, num);
EEPROM.put(3, irCode);
3.get()函数读取数据时须确保value的数据类型与put()写入时的value数据类型一致。
以上就是本专栏的全部内容。其实还有很多库函数没有介绍,一是不太常见并且UP做过的项目中也没用到,二是UP时间精力有限。比如Serial库中的end()函数,可以结束串口通讯等等。感兴趣的小伙伴还请前往官网查看。
1.本文基于对开源文档的查阅以及UP的实际项目编写。
2.由于UP的时间精力有限,文中难免出现纰漏错误,还请广大小伙伴们批评指正。
3.这篇专栏是这个系列在2025年上半年的最后一篇,后面的时间会逐步发布配套的视频,得抓紧时间把坑填上。
4.创作不易,如果喜欢,求三连,求关注。^_^