打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Arduino的串口通讯函数

串口通讯是单片机当中用到的最多的一种通讯,对我而言,它最大的一个优势就是简单,相对于I2C、SPI等,参与串口通讯的线只有两根,分别为接收端、发送端,当然还包括电源线,我们暂且不管。

单片机工作的时候一般都是单片机与之间单片机通讯,还有一种就是单片机与电脑的通讯,与电脑通讯主要是调试单片机的时候使用,那么串口通讯到底在通讯什么呢?它主要传输一些数据,比如12345、ABCD,也可以传输汉字,但是很少有人用汉字传输数据的,你知道为什么吗?

单片机之间为什么要串口通讯呢?是它们闲的无聊?

当然不是,它所传输的所有数据都是为控制做准备,那么这些数据怎么就能控制外设的呢?比如说LED灯。这些数据是不能直接控制LED灯开关的,比如说电脑给单片机发送“关灯”口令,LED灯就会关闭吗?不会的,单片机怎么会知道“关灯”是什么呢,但是单片机可以判断接收到的字符串,但是我们可以提前设置好,也就是给单片机编程,当单片机接收到“关灯”这两个字符时,它就给LED引脚输出低电平,以此来达到关闭LED灯的目的。

还有我们所传输的“关灯”,在单片机看来就是一堆二进制数字,比如说“10100011”,只有它接收到10100011这一串二进制数字时,单片机才会有所动作。这么看来单片机似乎有很傻、很死板,单片机是死的,但人是活的,我们可以把我们的思想写进单片机,这就是单片机的伟大之处。还有越是智能的芯片,人的参与越多,比如说现在流行的语音控制,苹果的SIRI、小米的小艾同学,它所能听懂的每一句话,都是软件工程师提前想好人们要说什么,并且写进芯片去的,这个工程就需要庞大的人力去完成。

Hello world

说了这么多,我们先来做一个最简单的小实验,让Arduino在电脑上打印,也就是让Arduino发送数据,电脑就收数据,并且电脑接收到数据之后打印在屏幕上。

void setup() {

Serial.begin(9600);

}

void loop() {

Serial.print('Hello World');

delay(1000);

}

程序中 函数Serial.begin(9600)是设置串口通讯的波特率为9600;

函数Serial.print('Hello World')是单片机的发送端向电脑发送引号之内的数据,即Hello World;

函数delay(1000)是延时1000毫秒,也就是一秒,为什么要延时呢?如果不延时,电脑接收数据会很频繁,你根本看不过来,给让人眼花缭乱的感觉。

在不加延时的情况下,我们可以观察Arduino板上的发送端LED灯,这时候它肯定是常亮的,正常情况下是只有接收到数据,LED灯才会闪烁一次,因为无时无刻在往电脑发送数据,我们来看一下是不是这样呢?可以看到TX(发送端)的LED灯是常亮(由于动图的清晰度太低,所以用普通照片代替Gif),如果我们加上延时之后LED灯就会每隔一秒闪烁一次。

实验现象

每隔一秒向屏幕打印Hello World,但是接收端看上去的感觉很乱,第一个Hello World和第二个Hello World收尾相接,给人很混乱的感觉,这是为什么呢?

原因在于Serial.print()函数只支持单纯的打印,并不支持换行,这时候我们需要用另外一个函数Serial.println()来解决这个问题,虽然只多了两个字母,但是打印出来的字符看的就舒服多了,因为它在打印完成之后,会另起一行继续打印,也可以理解为在打印完成数据之后,给电脑发送了回车键的命令。下面来看一下Serial.println()的实验效果。

电脑向单片机发数据

上面的实验是Arduino向电脑发送数据,我们现在让电脑向Arduino发送数据,比如发送0或者1。发送数据很简单,只需要我们在串口监视助手上面输入0或者1即可把我们想要发送的数据传给单片机。但是问题来了,我们怎么知道单片机收到数据了,从Arduino往电脑上发数据,因为电脑有屏幕,我们可以看到现象,Arduino没有屏幕怎么办呢?

这时候就需要依靠强大的Arduino库函数,比如我们前面所说的 Serial.begin(9600)、delay(1000)等都是库函数,我们可以直接调用,而无需知道他的源代码。依靠库函数可以看到我们发送数据时应有的现象,比如说我们给Arduino发送1,当Arduino收到1之后点亮LED,而收到0之后熄灭LED。

程序

int x = 0; //定义变量xvoid setup() { pinMode(13,OUTPUT); //设置13引脚为输出模式 Serial.begin(9600); //设置波特率为9600}void loop(){ if (Serial.available() > 0) //返回串口缓冲区中当前剩余的字符个数 { x = Serial.read();//把收到的数据赋给x if(x=='1') //如果收到的是1 digitalWrite(13,HIGH); //点亮LED if(x=='0') //如果收到的是0 digitalWrite(13,LOW); //熄灭LED}}

程序里面写注释了,在这里就不多作解释。

实验现象

当我们向Arduino发送1之后的实验现象,可以看到LED灯13亮了,然而屏幕上并没有显示任何东西,在点亮LED灯之后,Arduino是不是应该向电脑发送一些数据,比如发送“已经为你开灯”,当收到0之后,向电脑发送“已经为你关灯”。

进阶程序

这个程序也很简单,只需要把我们最开始的串口打印函数加上就可以了, 代码基本上和上面的差不多程序如下:

int x = 0; //定义变量x

void setup() {

pinMode(13,OUTPUT); //设置13引脚为输出模式

Serial.begin(9600); //设置波特率为9600

}

void loop()

{

if (Serial.available() > 0) //返回串口缓冲区中当前剩余的字符个数

{

x = Serial.read();//把收到的数据赋给x

if(x=='1') //如果收到的是1

{

digitalWrite(13,HIGH); //点亮LED

Serial.println('已经为你开灯');

}

if(x=='0') //如果收到的是0

{

digitalWrite(13,LOW); //熄灭LED

Serial.println('已经为你关灯');

}

}

}

实验现象

当收到1时,可以看到屏幕上的串口助手显示了“已经为你开灯”

当收到0时的实验现象

不止0和1

除了用0和1之外,我们还可以用“汉字”开灯控制LED灯,道理是一样的,如果有功放的话,还可以做语音播报,还有现在大火的物联网领域所使用的8266WIFI模块所使用的就是串口透传,只不过那个8266WiFi模块可以无线传输,甚至可以把我们上面程序之外的0和1穿到大洋彼岸的美国。我们现在做实验可以用0和1直接控制,但是等我们真正做产品时,如果像刚才那样是断然不可以的,一般所发送的数据可能是十几位数或更多,这是为了保证数据的可靠性和防干扰。

Final

列举一下我们用到的Arduino函数。

Serial.begin(); 设置串口波特率

Serial.print(); 不换行打印

Serial.println(); 换行打印

Serial.available() ;返回串口缓冲区中当前剩余的字符个数

Serial.read();读取一个字节

delay(); 延时函数

pinMode(); 设置引脚的输入输出

digitalWrite();给引脚高低电平

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Arduino与LabVIEW互动应用02
Arduino 语法
HC05蓝牙模块的使用
用arduino单片机,实现与flash虚拟人物ML(关键部位已打码)
如何使用Arduino和HM
Arduino 2560 esp8266控制LED(可不用USB转TTL)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服