通信协议基础以及常用的串口通信协议

通信协议:


串行通信和并行通信



在数据的通信方式中根据数据传输方式的不同可以分为:串行通信和并行通信

串行通信:串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
串行通信端口,即COM1、COM2,一般接鼠标,外置Modem或其他串口设备。它在一个方向上只能传送一路信号,一次只能传送一个二进制位,传送一个字节信息时,只能一位一位地依次传送。

在串行通信中,一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千米。 

串行通信的特点:

  • 优点传输距离远占用资源少
  • 缺点发送速度慢

并行通信:并行通信需要多条数据线,一般需要8条,可以一次传输1bite。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。

并行通信端口,即LPT1,俗称打印口,因为它常接打印机,它是同时传送八路信号,一次并行传送完整的一个字节信息。

并行通信的特点:

  • 优点发送速度快
  • 缺点传输距离短资源占用多


 单工通信、半双工通信、全双工通信


单工通信:只有一根数据线,通信只能在一个方向上进行(既就是只能一端发送数据另一端接收数据)
半双工通信:只有一根数据线,通信可以在两个方向上进行,但是不能同时进行(既就是两端都能发送和接收数据,但是不能同时既发送又接收数据)
全双工通信:有两条数据线,通信可以在两个方向上进行,可以同时进行发送和接收数据(既就是两根数据线都有发送器和接收器)

详细解释参考:https://blog.csdn.net/hai673580326/article/details/37819611?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-37819611-blog-8906060.pc_relevant_multi_platform_featuressortv2dupreplace&spm=1001.2101.3001.4242.1&utm_relevant_index=3


 同步通信、异步通信


 在串行通信中,由于是一位一位地进行数据传送。为了把每个字节区别开来,需要收发双方在传送数据的串行信息流中,加入一些标记信号位。在数据中根据所添加的标记信号位的不同方式,分成同步通信和异步通信两种。
同步通信:同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。
发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

异步通信:是一种很常用的通信方式(效率较低)异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。所传送的数据以字节为单位。每个字节前加上一位起始位,每个字节的后面加上停止位。好处:异步通信的好处是通信设备简单、便宜,但传输效率较低
发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

异步通信中的帧结构:      
START 位:  每帧以一个 START 位开始,并且始终为低电平。
数据位数据包:数据位可以是 5 到 9 位数据包。通常我们使用 8 位数据包,总是在 START 位之后发送。
STOP 位:可以是一位或两位。它在数据位包之后发送以指示帧的结束。停止位始终为逻辑高。

Note: 在异步串行通信帧中,第一个 START 位后跟数据字节和最后一个 STOP 位形成一个 10 位帧。有时最后一位也用作奇偶校验位。

  

异步通信采用应答方式(也称为握手方式):
异步通信的应答方式有三种:不互锁,半互锁,和全互锁。我们重新再举另外一个例子来说明这三种应答方式。你和张三在篮球场打球,你叫张三把球传给你。
你发出传球请求–>张三收到消息–>张三回复你“好”–>你接到球–>你回复张三“我接到球了”
不互锁
你发出传球请求,你不用等他回应你说“好”,只确定张三收到信息了,你就不再发出传球请求(撤销请求信号)。张三把球传给你,不用等你接到球再回复他“接到球了”,而是确定你接到球了,就(撤销回答信号)。
半互锁
你叫张三把球传给你,你要等他回应你说“好”,你才不发出传球请求(撤销请求信号)。张三把球传给你,不用等接到球再回复他“接到球了”,而是确定你接到球了,就(撤销回答信号)。
全互锁
你叫张三把球传给你,你要等他回应你说“好”,你再不发出传球请求(撤销请求信号)。张三把球传给你,要等你不再发出传球命令,才(撤销回答信号)。

 不管是同步还是异步,字符的发送时间和接受时间要一样。如一个字符发送为1秒,接受也需要为1秒(小于一秒的话,利用软件延时)
同步异步最大的不同是:异步传输时,间隙可以不同步。比如,帧1传输完后 隔5秒传输帧2.间隙为5秒。再接受方,接受完帧1后,可以隔10秒再开始接受帧2. 而同步传输,间隙也必须一致。

详细解释参考:同步通信和异步通信的区别_赤云的博客-CSDN博客_同步通信和异步通信主要区别


常用的串口协议


 UART(Universal Asynchronous Receiver/Transmitter)


通用异步收发器,是一种通用的串行、异步通用总线。该总线有两条数据线,可以实现全双工发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。在UART通讯协议中信号线上的状态位高电平代表’1’低电平代表’0’。当然两个设备使用UART串口通讯时,必须先约定好传输速率和一些数据位。

异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。

单片机有两个引脚是专门用来做 UART 串行通信的,它们分别叫做 RXD 和 TXD,由它们组成的通信接口就叫做串行接口,简称串口。 

整个串口控制器包含transmitterreceiver两部分,这两部分功能彼此独立

transmitter由发送缓冲区和发送移位寄存器构成。我们要发送信息时,首先将信息进行编码(一般用ASCII码)成二进制流,然后将一帧数据(一般是8位)写入发送缓冲区(从这里以后程序就不用管了,剩下的发送部分由硬件自动完成),最后发送移位寄存器会自动从发送缓冲区中读取一帧数据,然后自动移位(移位的目的是将一帧数据的各个位分别拿出来)将其发送到Tx通信线上。

receiver由接收缓冲区和接收移位寄存器构成。当有人通过串口线向我发送信息时,信息通过Rx通信线进入我的接收移位寄存器中,然后接收移位寄存器自动移位并将该二进制位保存入我的接收缓冲区,接收完一帧数据后receiver会产生一个中断给CPU,CPU收到中断后即可知道receiver接收满了一帧数据,就会来读取这帧数据。

UART FIFO

  • 典型的串口设计,发送/接收缓冲区只有1字节,每次发送/接收只能处理1帧数据。这样在单片机中没什么问题,但是到复杂SOC中(一般有操作系统的)就会有问题,会导致效率低下,因为CPU需要不断切换上下文。
  • 解决方案就是想办法扩展串口控制器的发送/接收缓冲区,譬如将发送/接收缓冲区设置为64字节,CPU一次过来直接给发送缓冲区64字节的待发送数据,然后transmitter慢慢发送,发送完再找CPU再要64字节数据。但是串口控制器本来的发送/接收缓冲区是固定的1字节大小的,所有做了个变相的扩展,就是FIFO。CPU先将64字节的数据放到FIFO中,然后启动FIFO模式,FIFO每次会自动往发送缓冲区中添加1字节数据,最后进行移位操作传输数据。
  • FIFO,就是first in first out,先进先出。FIFO其实是一种数据结构,这里这个大的缓冲区叫FIFO是因为这个缓冲区的工作方式类似于FIFO这种数据结构。

在这里插入图片描述

 细节参考:(77条消息) 串口通信UART_易风尘的博客-CSDN博客_uart串口通信

硬件连接

硬件连接比较简单,仅需要3条线,注意连接时两个设备UART电平,如电平范围不一致请做电平转换后再连接,如下图所示:

  • TX(发送数据pin):发送数据端,要接对面设备的RX
  • RX(接收数据pin):接收数据端,要接对面设备的TX
  • GND(接地pin):保证两设备共地,有统一的参考平面

软件通信协议 

  • 起始位:起始信号一般由一个逻辑“0”的数据位表示
  • 数据位:在起始位后,紧接着的是传输数据的主体内容,即有效数据。通常有效数据的长度有5-8位长
  • 校验位:在有效数据之后,有一个可选的数据校验位。由于数据通信很容易收到外界干扰,导致数据传输出现偏差,因此,可以在传输过程中加上数据校验位来解决这个问题。校验方法有奇偶校验,0校验,1校验以及无校验
  • 停止位:停止信号可由1,1.5或2个逻辑“1”的数据位表示
  • 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
  • 波特率:用于描述UART通信时的通信速度,其单位为bps(bit per second)即每秒钟传送的码元。(简而言之:串口传输的波特率即为每秒钟传输二进制的位数)常见的波特率9600bps,115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us。

以9600 8N1(9600波特率,8个数据位,没有校验位,1位停止位)为例,这是目前最常用的串口配置,现在我们传输’O’'K’两个ASCII值,'O’的ASCII为79,对应的二进制数据为01001111 ,'K’对应的二进制数据为01001011 ,传输的格式数据如下图所示: 

å¨è¿éæå¥å¾çæè¿°

串口波特率为9600,1bit传输时间大约为104us,传送一个数据实际是10个比特(开始位,8个数据位,停止位),一个bytes传输速率实际为9600*8/10=7680bps。 


 UART的延申USART


 等待后续补充

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值