串口通信协议是什么?接收和发送方式是什么?

介绍

嵌入式电子产品是有关互连电路(处理器或其他集成电路)以创建共生系统的。为了使这些电路交换信息,它们必须共享一个通用的通信协议。已经定义了数百种通信协议来实现此数据交换,并且通常可以将每种通信协议分为两类之一:并行或串行。


并行与串行

并行接口同时传输多个位。它们通常需要数据总线 -跨8、16或更多根导线传输。数据以1和0的巨大碰撞波进行传输。




串行接口一次只能传输一位数据。这些接口只能使用一根导线工作,通常不会超过四根。



可以将这两个接口视为一堆汽车:并行接口将是8车道的巨型高速公路,而串行接口则更像是两车道的乡间小路。在一段特定的时间内,这条大型高速公路可能会吸引更多的人前往目的地,但农村的两车道达到了其目的,并且花费了建设资金的一小部分。

并行通信当然有其好处。它快速,简单且易于实施。但它需要更多的输入/输出(I / O)线。如果您曾经不得不将项目从基本的Arduino Uno转移到Mega,那么您就会知道微处理器上的I / O线可能非常宝贵,而且很少。因此,我们经常选择串行通信,以牺牲引脚空间的潜在速度。


异步串口

USB(通用串行总线)和以太网是几个比较知名的计算串行接口。其他非常常见的串行接口包括SPI,I2C和我们今天要讨论的串行标准。这些串行接口中的每一个都可以分为以下两组之一:同步或异步。

同步串行接口始终将其数据线与时钟信号配对,因此同步串行总线上的所有设备都共享一个公共时钟。这样可以进行更直接,通常更快的串行传输,但同时在通信设备之间至少需要一根额外的电线。同步接口的示例包括SPI和I 2C。

异步是指在没有外部时钟信号支持的情况下传输数据。这种传输方法非常适合于最小化所需的电线和I / O引脚,但这确实意味着我们需要付出一些额外的努力来可靠地传输和接收数据。


序列规则

异步串行协议具有许多内置规则-帮助确保可靠且无错误的数据传输的机制。我们为避免外部时钟信号而获得的这些机制是:

  • 数据位

  • 同步位

  • 奇偶校验位

  • 和波特率。

通过各种这些信令机制,您将发现没有一种串行发送数据的方法。该协议是高度可配置的。关键部分是确保串行总线上的两个设备都配置为使用完全相同的协议。


波特率

波特率指定通过串行线发送数据的速度。通常以每秒位数(bps)为单位表示。如果反转波特率,则可以找出传输单个位需要多长时间。该值确定发送器将串行线保持为高/低状态的时间,或接收设备在多长时间内对其线进行采样。

在合理范围内,波特率几乎可以是任何值。唯一的要求是两个设备均以相同的速率运行。9600 bps是较常见的波特率之一,尤其是对于速度不是很关键的简单波特率。其他“标准”波特是1200、2400、4800、19200、38400、57600和115200。

波特率越高,发送/接收数据的速度就越快,但是对数据传输速度的限制。您通常不会看到超过115200的速度-对于大多数微控制器而言,这是很快的。太高了,您将开始在接收端看到错误,因为时钟和采样周期无法跟上。


整理数据

实际传输的每个数据块(通常为一个字节)都以数据包或位帧的形式发送。通过将同步和奇偶校验位附加到我们的数据中来创建帧。


数据块

每个串行数据包的实质都是它所携带的数据。我们不确定性地将此数据块称为块,因为没有具体说明其大小。每个数据包中的数据量可以设置为5到9位。当然,标准数据大小是您的基本8位字节,但其他大小也有其用途。7位数据块的效率可能高于8位,尤其是在您仅传输7位ASCII字符的情况下。

在同意字符长度之后,两个串行设备还必须就其数据的字节序达成一致。数据发送的最高有效位(msb)是否最小,反之亦然?如果没有其他说明,通常可以假定首先传输数据的最低有效位(lsb)。


同步位

同步位是随每个数据块一起传送的两个或三个特殊位。它们是开始位和停止位。正如其名称一样,这些位标记数据包的开始和结束。始终只有一个起始位,但是停止位的数量可以配置为一或两个(尽管通常保留为一)。

起始位始终由一条从1到0的空闲数据线表示,而停止位将通过将该行保持在1来转换回空闲状态。


奇偶校验位

奇偶校验是非常简单的低级错误检查的一种形式。它有两种口味:奇数或偶数。为了产生奇偶校验位,将数据字节的所有5-9位相加,总和的偶数决定是否设置该位。例如,假设奇偶校验设置为偶数,并被添加到像这样的数据字节中0b01011101,其奇数为1(5),则奇偶校验位将设置为1。相反,如果将奇偶校验模式设置为奇数,则奇偶校验位将为0。

奇偶校验是可选的,并不是很广泛。它对于在嘈杂的介质间传输很有帮助,但也会降低数据传输速度,并且要求发送者和接收者都实施错误处理(通常,必须重新发送失败的接收数据)。

9600 8N1-9600波特,8个数据位,无奇偶校验和1个停止位-是较常用的串行协议之一。那么,一包或两包9600 8N1数据是什么样的呢?举个例子吧!

传输ASCII字符“ O”和“ K”的设备必须创建两个数据包。O的ASCII值(大写)为79,分为8位二进制值01001111,而K的二进制值为01001011。剩下的就是追加同步位。

它没有特别说明,但假设首先传输数据的最低有效位。请注意,从右到左读取时,如何发送两个字节中的每个字节。


由于我们以9600 bps的速度进行传输,因此将这些位保持高位或低位所花费的时间为每位1 /(9600 bps)或104 µs。

对于每个传输的数据字节,实际上有10个位被发送:一个起始位,8个数据位和一个停止位。因此,在9600 bps时,我们实际上每秒发送9600位或每秒960(9600/10)字节。


现在您知道了如何构造串行数据包,我们可以继续进行硬件部分。在那里,我们将了解如何在信号电平上实现那些1和0以及波特率。


接线和硬件

串行总线仅由两根电线组成-一根用于发送数据,另一根用于接收。因此,串行设备应具有两个串行引脚:接收器RX和发送器TX。


请务必注意,这些RX和TX标签是相对于设备本身的。因此,来自一台设备的RX应该转到另一台设备的TX,反之亦然。如果您习惯于将VCC连接到VCC,将GND连接到GND,将MOSI连接到MOSI等,这很奇怪,但是考虑一下就可以了。发射机应与接收机通信,而不是与其他发射机通信。

两个设备都可以发送和接收数据的串行接口是全双工或半双工。全双工意味着两个设备可以同时发送和接收。半双工通信意味着串行设备必须轮流发送和接收。

某些串行总线可能仅通过发送和接收设备之间的单个连接就可以摆脱。例如,我们的“ 串行启用” LCD实在令人耳目一新,并且实际上没有任何数据可以中继回控制设备。这就是所谓的单工串行通信。您只需要一条从主设备的TX到听众的RX线的电线即可。


硬件实施

我们知道我们需要哪些电线。但是,串行通信实际上是如何在信号级别上实现的呢?答案是:以各种方式。串行信令有各种各样的标准。让我们看一下串行的两种较流行的硬件实现:逻辑级(TTL)和RS-232。

当微控制器和其他低级IC进行串行通信时,它们通常以TTL(晶体管-晶体管逻辑)级别进行通信。TTL串行信号存在于微控制器的电源电压范围之间-通常为0V至3.3V或5V。VCC电平(3.3V,5V等)的信号表示空闲线,值为1的位或停止位。0V(GND)信号代表值为0的起始位或数据位。


RS-232可以在一些较古老的计算机和外围设备上找到,就像TTL串行翻转在头上一样。RS-232信号的范围通常为-13V至13V,尽管该规范允许+/- 3V至+/- 25V的范围。在这些信号上,低电压(-5V,-13V等)表示空闲线,停止位或值为1的数据位。高RS-232信号表示起始位或0-值数据位。这与TTL串行相反。


在两个串行信号标准之间,TTL更容易实现到嵌入式电路中。然而,低电压电平更容易受到长传输线两端的损耗的影响。RS-232以太网模块或更复杂的设备(例如RS-485串口转以太网模块)更适合于远程串行传输。

将两个串行设备连接在一起时,确保它们的信号电压匹配很重要。您不能直接将TTL串行设备与RS-232总线接口。您将不得不改变那些信号。

UART

这个串行难题的最后一步是找到一些东西来创建串行数据包并控制这些物理硬件线路。输入UART。

通用异步接收器/发送器(UART)是负责实现串行通信的电路块。本质上,UART充当并行和串行接口之间的中介。UART的一端是一条八根左右的数据线(加上一些控制引脚)的总线,另一根是两条串行线-RX和TX。



超级简化的UART接口。一端并行,另一端串行。


UART确实可以作为独立的IC存在,但更常见于微控制器内部。您必须检查微控制器的数据表,以查看其是否具有任何UART。有些没有,有些只有一个。例如,基于“老旧的” ATmega328的Arduino Uno只有一个UART,而基于ATmega2560的Arduino Mega则具有多达四个UART。

正如首字母缩写词R和T所指出的那样,UART负责发送和接收串行数据。在发送端,UART必须创建数据包(附加同步和奇偶校验位),并以精确的时序(根据设置的波特率)将该数据包发送到TX线。在接收端,UART必须根据预期的波特率对RX线进行采样,挑选出同步位,然后吐出数据。


更高级的UART设备,如有人的超级网口系列的串口转以太网模块可能会将接收到的数据扔到缓冲区中,直到微控制器开始获取为止。UART通常将基于先进先出(FIFO)释放其缓冲数据。缓冲区可以小到几位,也可以大到几千个字节。


软件UART

如果微控制器没有UART(或没有足够的UART),则可以对串行接口进行位冲击 -由处理器直接控制。这是像SoftwareSerial这样的Arduino库所采用的方法。位撞击是处理器密集型的,通常不如UART精确,但它可以正常工作。



客服咨询

微信互动

使用教程

返回顶部

商城小程序购买

微信支付更方便