Arduino Serial与EEPROM库函数
阿巴阿巴家的迷你3PRO
2025年02月07日 08:00
收录于文集
共5篇

前言

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.创作不易,如果喜欢,求三连,求关注。^_^