Arduino 串行通信之串口通信 UART 原理及释义

简介

        对于Arduino来说,甚至是对于电子学领域来说,信号分为数字信号和模拟信号。这两种信号又分为输入和输出两种情况,所以我的理解是电子学就是一门研究这四种情况相互关系的学科。模拟信号是一种连续变化的物理量,能帮助我们更好地理解周围环境的信息,任何的信息都可以用模拟信号来准确表达,但其缺点是易受噪声的影响,信号被多次复制,或进行长距离传输之后,会发生衰减。相比而言数字信号受噪声的影响小,易于传输、处理和存储,现在被广泛应用于电子领域,但数字信号的缺点是每次的信息量小,只有0和1两种状态,所以就出现了串行通信的概念,通过多次的0或者1的数字信号组合来表达更丰富的信息。本章我们就来介绍一下Arduino中最基本的串行通信。

串行通信

        串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位传送的,每一位为1或者为0。这就好像大家在电视里看到的通过敲门声的长短能够表达一些复杂的信息一样,这里敲门声的长短就相当于信号0或者1,只要双方约定好,就能够通过这种长短的变化表达固定的信息。在串行通信中,“双方约定好”这一点很重要,因为从实质上来说,通信的信号就是一堆0和1的数字,如果没有约定好这些0、1数字组合所代表的意义,那么双方不可能知道对方所发送信息的含义,就好像如果两个人交谈时使用不同的语言,那么他们的交谈是没有任何意义的。

串行通信的约定

        串行通信中的这种约定包含两个方面,一方面是通信的速率要保持一致,另一方面是字符的编码要一致。

波特率

        通信速率是指单位时间内传输的信息量,可用比特率和波特率来表示。比特率是指每秒传输的二进制位数,用bps (bits)表示。波特率是指每秒传输的符号数,若每个符号所含的信息量为1比特,则波特率等于比特率。在电子学中,一个符号的含义为高电平或低电平,它们分别代表"1"和"0"。所以 ,每个符号所含的信息量刚好为1比特,因此常将比特率称为波特率,即:

        1波特(B) =1比特(bit) =1位/秒(1bps)

        常用的波特率有: 110,300,600,1200,2400,4800,9600,19200,38400,115200等最常用的是9600。

ASCII码

        ASCII码是由美国国家标准学会(American National Standard Institute , ANSI)制定的,其英文全称是American Standard Code for Information Interchange,它是现今最通用的单字节编码系统,主要是为了解决大家在串行通信中的信息一致性问题。在Arduino中也采用这种字符编码方式。

        在计算机中,所有的数据在存储和运算时都用0或者1来表示,像a,b,c,d这样的字母(包括大写共52个);以及0、1等数字还有一些常用的符号(*、#、@等)在计算机中都要使用0或1来表示,而具体用哪些0、1组合表示哪个符号,每个人都可以约定自己的一套定义(这个定义就叫编码),只要双方的编码一致就可以通信了。而要想让更多人互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCI1编码,统一规定了上述常用符号用哪些0、1的组合来表示。ASCII是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。

标准的ASCII码

        ASCII码使用指定的7 bit或8 bit数据组合来表示128或256种可能的字符。标准,ASCI码使用7bit数据来表示所有的大写和小写字母、数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。

        其中0~31及127 (共33个)是控制字符或通信专用字符,如: LF (换行)、CR (回车)、FF (换页)、 DEL (删除)、BS (退格)、 BEL (响铃)等;通信专用字符包括:SOH (文头)、EOT (文尾)、ACK (确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和回车字符。这些字符并没有特定的图形显示,但会依不同的应用程序,而对文本显示产生不同的影响,其余为可显示字符。32 ~ 126 (共95个)是字符(32是空格),其中 48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97 ~ 122号为26个小写英文字母,其余为一些标点符号、运算符号等。

串行通信的应用

        使用串行通信我们就能让Arduino与计算机通信了,在Arduino端进行串行通信的引脚称为串行端口,一般分为发送和接收,其中发送用TX表示,接收用RX表示。

深入了解Arduino与外部设备的通信方式,这些通信方式均属于串行通信.。串行通信是相对于并行通信的一个概念.。

如上图所示,并行通信虽然可以多位数据同时传输,速度更快,但其占用的I/O口较多,而Arduino的I/O口资源较少,因此在Arduino中更常用的是串行通信方式。

        Arduino硬件集成了串口 IIC SPI 三种常见的通信方式,掌握了这三种通信类库的用法,即可与具有相应通信接口的各种设备通信,也可以为基于这些通信方式的传感器或模块写驱动程序。

硬件串口通信---HardwareSerial 类库的使用

        串口,也称UART(Universal Asynchronous Receiver Transmitter,通用异步(串行)收/发器)接口,是指Arduino 硬件集成的串口。

        在Arduino中,通过Arduino上的USB接口与计算机连接而进行Arduino与计算机之间的串口通信。除此之外,还可以使用串口引脚连接其他的串口设备进行通信。需要注意的是,通常一个串口只能连接一个设备进行通信。

连接如下图所示:

在进行串口通信时,两个串口设备间需要发送端(TX)与接收端(RX)交叉相连,并共用电源地(GND)。

        在Arduino UNO 及其他使用ATmega328芯片的Arduino控制器中,只有一组串行端口,即位于0(RX)和1(TX)的引脚。

串口工作原理

   在Arduino与其它器件通讯的过程中,数据传输实际上都是以数字信号(即电平高低变化)的形式进行的,串口通信也是如此。当使用Serial.print()函数输出数据时,Arduino的发送端会输出一连串的数字信号,称这些数字信号为数据帧。

   例如,当时用Serial.print('A')语句发送数据时,实际发送的数据帧格式如下图所示:

(1)起始位

        起始位总为低电平,是一组数据帧开始传输的信号.

(2)数据位

        数据位是一个数据包,其中承载了实际发送的数据的数据段. 当Arduino通过串口发送一个数据包时,实际的数据可能不是8位的,比如,标准的 ASCII码是0~127(7位). 而拓展的 ASCII码则是0~255(8位). 如果数据使用简单的文本(标准ASCII码),那么每个数据包将使用7位数据. Arduino默认使用8位数据位,即每次可传输1B数据.

(3)校验位

        校验位是串口通信中一种简单的检错方式。 可以设置为偶校验或者奇校验。当然,没有校验位也可以。Arduino默认无校验位。

(4)停止位      

        每段数据帧的最后都有停止位表示该段数据帧传输结束。 停止位总为高电平,可以设置为停止位为1位或2位。Arduino默认是1位停止位。

        当串口通信速率较高或外部干扰较大时,可能会出现数据丢失的情况。 为了保证数据传输的稳定性,最简单的方式就是降低通信波特率或增加停止位和校验位。 在Arduino中,可以通过Serial.begin(speed, config)语句配置串口通信的 数据位 停止位 和 校验位 参数。config 的可用配置可去网上搜索相应配置表。

请大家注意区别:串口通信和串行通信。串行通信指的是一个大类,区别于并行通信;本系列中提到的串口通信一般指Arduino上面的USART通信模式,USART也是串行通信的一种,可以有硬串口,软串口两种实现方式,并且USART是一种异步串行通信.

相关案例: 环境监测 温湿度传感器 案例   

  • 33
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值