一文彻底搞懂嵌入式中UART、RS232、RS485、CAN协议

一文彻底搞懂嵌入式中UART、RS232、RS485、CAN协议

之前分享过一些使用UART、RS232、RS485、CAN协议进行传感器数据读取、伺服电机控制的文章,但这些协议之间到底有什么不同,工作原理又到底是什么,还是非常有必要好好总结一下的。

UART

UART又称通用异步接收/发送装置,简称“串口”,是一个要完成一个特定功能的硬件,它本身并不是协议。一般可用于调试(打印调试信息)和外接各种模块,串口结构简单、稳定可靠。有三条线,发送线(TXD)、接收线(RXD)、地线(GND)。在与硬件连接时,连接方式如下:

在这里插入图片描述

串口的参数包括:波特率、起始位、数据位、校验位、停止位。

波特率:一般波特率会有9600、19200、115200等,表示每秒可以传输多少个比特位数(bits)。

起始位:发出一个逻辑“0”的信号,表示传输数据的开始,这个逻辑“0”对于不同的协议表示的含义不一样,下面在具体的协议里会讲到。

数据位:可以是5~8位逻辑“0”或“1”。比如ASCII码(7位),扩展BCD码(8位)。采用的是小端传输。

校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),依此来校验数据传送的正确性。

停止位:它是一个字符数据的结束标志。

image-20220508212558070

我认为UART串口是一个统称,它包括了TTL、RS232、RS485这些通信协议的最基本特征,而这些协议又在此基础上有自己的特征,比如逻辑电平。

UART串口通信方式包括串行通信和并行通信,并行通信是指一次能够同时传送多位数据的通信方法;串行通信是指数据一位一位传输的通信方法。

串行通信可以分为两大类:同步通信和异步通信:

同步通信:指的是发送器和接收器使用同一时钟源来同步。比如I2C、SPI。

异步通信:收发双方的时钟不是同一时钟,是由双方各自的时钟实现数据的发送和接收,但要求使用同一频率(波特率相同)。典型的就是UART。

串行通信的传输方式有3类:单工、全双工、半双工。

单工:数据传送是单向的,一端为发送端,另一端为接收端,即只有一根数据线和一根地线。

全双工:数据传送是双向的,且可以同时接收和发送数据,这种传输方式除了地线之外,需要两根数据线。

半双工:数据传送也是双向的,一根数据线和两根数据线都可以,任何一个时刻,只能由一方发送数据,另一方接收数据,不能同时收发。

RS232

为了使信号传输的更远,美国电子工业协会EIA制定了串行物理接口标准RS-232C。下面是RS232的9芯串行接口排列图:

image-20220514172424115

其中9芯串行接口1-9引脚含义如下表所示:

image-20220514172605063

在RS232串行通信接口中我们常用的也只有2、3引脚,即接收数据线、发送数据线。在与硬件进行通信时,硬件连接可以参考我之前分享的一篇关于串口编程读取倾角传感器,不过那篇文章是RS485接口,这里给出RS232接口硬件连接的示意图:

image-20220514173234439

下面介绍RS232的特别之处,RS-232采用负逻辑,即-3~-12V为逻辑“1”,3-12V为逻辑“0”,这一点和TTL的逻辑电平是不同的。下面分别给出TTL和RS232的逻辑电平示意图:

下面是TTL的逻辑电平:

image-20220514173856468

在xV至5V之间,就认为是逻辑1,在0V至yV之间就为逻辑0。

下面是RS232的逻辑电平:

image-20220514173948828

在-12V至-3V之间,就认为是逻辑1,在+3V至+12V之间就为逻辑0。

由此可见,RS232的电平比TTL高,所以能传输更远距离(电平高不是传输远的唯一指标),在工业上应用的比较多。

RS485

由于RS232接口仅能实现点到点的通信方式,不能实现联网功能,所以出现了RS485。RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接32个节点。

RS485通信协议是一种串行通信协议,相比于RS232通信协议通信距离短、速率低的缺点,RS485传输距离更长,传输速率最高可达10Mbit/s。RS485通信协议采用的是半双工工作方式,只能有一点处于发送状态,因此,在程序中或者电路设计中要有一个切换发送状态与接收状态的标志位。

在这里插入图片描述

RS485与RS232不同的还有,RS485的工作方式是差分工作方式,所谓差分工作方式,是指在一堆双绞线中,一条定义为A,一条定义为B。通常情况下,发送驱动器A、B之间的正电平在+2+6V,是一个逻辑状态“1”,负电平在-2-6V,是另一个逻辑状态“0”(和RS232是相反的),另有一个引脚信号接地。

6EEA1F29-6261-418d-8437-9CBEC4B18C5D

硬件连接图如下:

在这里插入图片描述

CAN通信协议

(1)CAN(Controller Area Network)又称为局域网控制器,汽车上基本都是采用CAN通信,CAN通信协议拥有稳定性和准确性,传输速率比RS485还高。

(2)多主控制:总线空闲时,所有单元都可以发送消息,但当两个以上的单元同时开始发送消息时,总线会根据标识符ID决定优先级。CAN协议是串行异步通信,同一时刻只能有一个发送或接收信息,由CAN_High和CAN_Low两条信号线,以差分信号的形式进行通讯,这一点和RS485是一样的。

(3)CAN通信协议通信速度快,通信距离较远,并且具有错误检测、错误通知与恢复功能。

(4)CAN总线的报文结构:CAN总线上的报文传输有4种不同的帧类型表示和控制,分别为数据帧、远程帧、错误帧、过载帧。我们这里主要介绍数据帧,数据帧携带数据从发送器至接收器。总线上传输的大多是这种帧。从标识符长度上,又可以把数据帧分为标准帧(11 位标识符)和扩展帧(29 位标识符)。数据帧由 7 个不同的位场组成:帧起始、仲裁场、控制场、数据场、CRC 场、应答场、帧结束。其中,数据场的长度为 0~8 个字节。标识符位于仲裁场中,报文接收节点通过标识符进行报文滤波。

(5)Linux系统中CAN总线配置:在Linux系统中,CAN总线接口设备作为网络设备被系统统一管理,在控制台下,CAN总线的配置和以太网的配置使用相同的命令。主要有三个命令:关闭、设置波特率、启动。

CAN总线通讯接口如下:

image-20220514180841907

关于CAN通讯编程在linux系统中的应用,可以参考我之前的文章:嵌入式开发板中的CAN通信编程——伺服电机驱动。

至此,关于嵌入式中UART、RS232、RS485、CAN通信协议的基本原理和应用基本上就讲完了。还有一些不足,以后有更深入的了解之后再给大家补充。

我是河边小乌龟爬,学习嵌入式软件开发路上的一名小学生,欢迎大家相互交流哇。公众号:河边小乌龟爬。

猜你喜欢

转载自blog.csdn.net/zhm1949/article/details/124773283
今日推荐