第19课 串口通信简介与PC控制LED开关

我是潘,曾经是个工程师。这是为 Ardui.Co 制作的 “Arduino 公开课” 系列的入门教程。经过前面一共18课的基础学习,我们已经掌握了 Arduino 的基本操作,现在是时候进入更深的一个层面。后面几节课会介绍 Arduino 的各类通信协议和内部运作机制。掌握这些知识后,你就可以称为砖家了。有任何疑问请在评论区提出,我会逐一回答。

Arduino 支持串口、I2C、SPI、ISP等几个通信协议。其中,每次写入程序、监测传感器反馈数据时都用到了串口。可以说,串口是人机交互中用到最频繁的一个接口。

但是之前除了按“Upload”写入程序外,串口的作用都是接受传感器的反馈,那么是否可以反过来,通过串口向 Arduino 发送数据,控制 Arduino 呢?其实,很简单。

这次实验我们只需一块 Arduino Uno,通过 USB 接上电脑,写入下面的程序,打开串口监视器,我们输入什么,监视器就会反馈什么:

是不是很无聊?但其中的学问却很多!

首先,该语句用于判断串口缓存中是否有值,如果有才执行赋值和打印,如果没有这个语句,串口监视器会不断循环打印值为空的语句,俗称刷屏了。

其次,Serial.read() 读取串口缓存的数据,每次一个字符值,注意字符值是数字,比如字符“a”得到的结果是“97”,所以需要char() 将其转换为字符值。

现在简单修改一下程序,控制开发板上的LED,输入1打开,输入其他任意字符关闭:

现在问题来了,Serial.read() 每次只能读取一个字符值,如果输入的是一串字符,Arduino 怎么接收?我们修改一下第一个程序:

该程序的核心是:

既然 Serial.read() ,每次只能从串口缓存中读取一个值,那么我们就把每个值,通过 while 语句一个个地赋予字符串变量 incomingByte。

疑问又出现了,Arduino 串口的缓存有多大呢?如果输入一个超大的字符串,是否会溢出?

Arduino串口缓冲区默认为64字节,如果你单次传输的数据较多可以将
#arduino安装目录#\hardware\arduino\cores\arduino\HardwareSerial.cpp中的
#define SERIAL_BUFFER_SIZE 64 修改为 #define SERIAL_BUFFER_SIZE 128 这样就有128字节的缓冲区了。

值得注意的是,程序中delay(2)不能删略,因为读取缓冲区数据需要时间,如果上一个字符没有读取完毕时,进入第二个字符读取的循环,就会出现错误。

Leave a Reply

Your email address will not be published. Required fields are marked *