Hi٩(๑ ^ o ^ ๑)۶,各位深海王国的同志们,早上下午晚上凌晨好呀~
辛勤工作的你今天也辛苦啦(o゜▽゜)o☆
今天大都督继续为大家带来系列——小学生都能玩的单片机!带你一周内快速走进嵌入式的大门,let’s go!
(6)uart串口通信与其他通信和Arduino程序下载失败的问题
经过了前五节,相信大家对Arduino如何使用已经很熟悉了,那么从今天这节开始,我们将会更加深入地了解嵌入式与单片机,相信大家都已经准备好了,加油!
什么是单片机通信?
我们之前介绍过,嵌入式系统就好比我们房子的管家,单片机就好比管家的大脑(见(1)单片机的介绍与嵌入式基本知识)。
同时,在高中生物中我们学过,大脑是通过神经元控制我们的四肢,而神经元之间通过电或化学信号传递信息。
(图片来源于网络,侵删)
我们单片机之间的通信跟它们是一样一样的,比如我这边发送个高电平1,你那边就开灯,我这边发送个低电平0,你那边就关灯,这就是单片机之间的通信。
就像管家有手有脚,有鼻子有眼一样,在一个单片机系统里,总会有各种各样的外设:视觉传感器就好比管家的眼睛,温度传感器是皮肤,超声波传感器是耳朵等等等。
那么管家的大脑,也就是单片机,就需要和他们进行通讯来获取或写入数据;有的时候单片机还需要跟另一块电路板上的单片机(另一个管家)通讯;甚至有时还需要跟电脑进行通讯,比如我们下载程序的时候。
(图片来源于网络,侵删)
那么在这些通讯的过程中,就产生了不同的通讯方式。
在本系列第二节(2)初识Arduino与基本单片机电路知识中,我们在Arduino的通信引脚一栏中可以看到arduino支持的几种通讯方式有:
- I2C通信:A4(SDA)和A5(SCL)引脚用于与I2C/TWI设备进行数据通信。
- SPI通信:通过数字引脚10(SS)、11(MOSI)、12(MISO)和13(SCK)进行SPI通信。
- 串行通信:引脚0(RX)和1(TX)用于TTL(Transistor-Transistor Logic)串行通信。
这三种也是单片机最常见的通讯方式,其中最简单最常用的就是串口通讯啦,现在我们分别来讲一讲他们的区别与优势。
uart串口通讯:
串口通讯到底有简单呢,众所周知把大象装进冰箱要三步,在arduino上使用串口通讯比把大象装冰箱还简单,只需要两步:
- 打开串口设置波特率
Serial.begin();
, - 发送数据
Serial.print();
,
就怎么简单。然后如果你觉得发送的太快就用delay();
函数延迟一段时间再发送。
如图,只需要怎么几行代码就可以给其他设备发送hello world了。
这个通讯其实只需要两根线(算上地线是三根)就能实现,一根发送T (Transmit),一根接受R(Receive)。
这里一定要注意,需要共地,共地,共地!至于什么是共地,为什么要共地,请看本系列第二节(2)初识Arduino与基本单片机电路知识
这两根线是相互独立的,也就是说我们能同时进行数据的发送与接受。是不是很简单?
但串口通讯也有一些缺点,比如通信速度慢,只支持一对一通信等。同时因为串口通信使用的是TTL电平,所以也不能远距离通信。
什么是TTL电平呢,这种专业术语乍一看很唬人,实际上就是大家提前约定好了在这个电压标准中什么是0什么是1:
在TTL电平标准里:
- 0V到0.8V的电压被认为是低电平(表示“0”)。
- 2V到5V的电压被认为是高电平(表示“1”)。
SPI通讯:
串口通讯通信速度慢,通常情况下,我们使用的最高波特率也就是115200(即11.25KB/s),这个速度下,哪怕你只是下载1个G的游戏。都要下19个小时。
速度慢,究其原因就是因为双方的通讯收到波特率的限制,波特率高,意味着频率越高,对时钟的精度也越高,再高就容易误码了。
那么什么是波特率呢?
这里需要注意哦,波特率并不是简单的速率,不直接等同于数据传输速度。
简单来说,如果你用闪光灯向朋友发送莫斯电码,你闪光的快慢(多久闪一次)决定了你的“波特率”。如果1秒钟能闪5次,那么波特率就是5。但这并不意呀着你每秒能发送5个字母,因为每个字母的莫尔斯电码是不同的,有的长有的短,所以实际能传送的字母数量可能会更少。波特率只是告诉我们信号变化的速度,实际传输的数据量还得考虑每个信号变化能携带多少信息。
更具体一点,波特率是衡量数据传输速度的一种方式,指的是每秒钟传输多少次信号变化。每次信号变化能够携带的信息量取决于系统的设计,但波特率本身关注的是信号变化的频率,而不直接关注信息量的多少。
那么有什么办法能解决传输速率慢的问题呢?
我们可以多加一根时钟线CLOCK,这样双方就不需要约定速度,发送端发送数据的同时,CLOCK这边也发送一个上升沿,就好像喊了一句话让你准备开始接收信号了。当接收端CLOCK线接收到上升沿时,听到有人喊他时,就去数据线上开始接受信号,这样是不是快多啦?
(图片来源于网络,侵删)
没有了波特率的限制,SPI通讯的速率可以轻松突破10M,所以大家可以观察一下,如果手边有像SD卡模块、屏幕模块这样数据传输量大的硬件外设,一般上面都有CLOCK时钟线。
I2C通讯:
接下里我们来了解一下I2C通讯,I2C主要解决的就是一对多通信的问题,假如我们的系统里有很多个传感器,那么就需要多个串口去挨个连接,这样就很浪费资源,所以就衍生出了I2C通讯,它最大的优势就是支持多设备通讯。
(图片来源于网络,侵删)
一共就两根线一个时钟线CLOCK和数据线DATA,这两根线也叫总线,所有设备都连接在这上面,每个设备都有自己独立的ID,单片机想要和谁通讯,按照指定通讯协议在总线上呼叫一下对方就可以:
“老李,给我发数据”,“老王,准备接受数据”。
这样就可以实现指定设备的数据发送和接受啦。而其他设备会自动忽略这些指令,是不是很方便呀?
Arduino程序下载失败的问题:
关于通讯方面的了解到这里就差不多啦,接下来我们来聊一聊在使用串口时的Arduino程序下载失败的问题。
我们现在已经知道了Arduino UNO开发板只有一个硬件串口,引脚号为0和1,同时我们想通过电脑给Arduino开发板下载程序的时候,也要使用这个唯一的硬件串口,这时候就出现了串口冲突问题。
也就是说,如果我们Arduino开发板的0、1号引脚接线了,想给Arduino下载程序,就需要先将0、1号引脚的线拔掉再下载,程序下载好以后才能接回去。
否则就会出现这样的报错:Failed uploading: uploading error: exit status 1,意思就是我们下载出错。
出现问题的原因与解决办法:
-
硬件串口被占用,把0、1端口上的线拔掉再下载;
-
板子的型号、或者连接的端口号选择不对,如何选择正确端口号见(4)CH340驱动安装与Arduino程序下载;
-
电脑端口坏了或者接触不良,换一个端口试试;
-
打开了串口监视器,关掉串口监视器重新插一下线下载;
这可是刚入门Arduino时最容易出现的问题,看看你是否中过招?
同时还需要注意当我们使用到I2C功能时,Arduino的A4、A5引脚是不能再作为模拟输入引脚使用的(关于模拟输入引脚的用法我们下节会讲),它们与Arduino的数据线SDA、时钟线SCL一齐构成了Arduino的I2C总线。
同样的还有SPI,如果想使用Arduino的SPI通信就要占用掉Arduino的10、11、12、13号引脚,大家也要注意一下哦。
文章的最后,大家可能会有疑问:每次下载个程序还要插拔线?太麻烦了吧,大都督。有没有什么更简单的方式解决串口占用这个问题呢?
当然是有的啦,在之后我们会讲到的软串口就能从编程层面解决这个问题,不过今天的学习到这里就差不多啦,辛苦啦~
哈哈,让焦虑不再蔓延,信息不再高壁,如果你觉得这篇文章对你有帮助,就来个免费的点赞吧!
(◍˃̶ᗜ˂̶◍)✩ 我深海大都督正式授予你深海王国公民的身份~
(・ω< )★ 加入深海大家庭,快乐摆烂每一天!