草庐IT

【嵌入式物联网常用的通信协议UART、RS-232、RS-422、RS-485、CAN、IIC、SPI】

程序小鹿 2023-04-08 原文

计算机与嵌入式系统领域的高速串行总线技术

一、串口通信基础知识

1、常见的串行通信标准

  • 目前常见串行通信接口标准有RS-232、RS-422、RS-485等。另外,SPI(串行外设接口)、I2C(内置集成电路)和CNA(控制器局域网)通信也属于串口通信。

2、常见的电平信号及其电气特性

  1. TTL电平
逻辑1逻辑0
输入>=2.0V<=0.8V
输出>=2.4V<=0.4V

噪音容限较低,约为0.4V,MCU芯片引脚都是TTL电平
2. CMOS电平

逻辑1逻辑0
输入>=0.7V<=0.3V
输出>=0.8V<=0.1V

噪音容限高于TTL电平,Vcc为供电电压
3. RS-232电平

电平信号名称逻辑1逻辑0
RS-232-15V ~ -3V3V ~ 15V

PC的COM口为RS-232电平
4.USB电平

电平信号名称逻辑1逻辑0
USB电平(Vd+- Vd-)>= 200mV(Vd-- Vd+)>= 200mV

采用差分电压,4线制:Vcc、GND、D+、D-

二、UART(通用异步收发器)协议

是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信

1、UART消息帧格式

  • 空闲位:不进行传输数据时,默认为逻辑1,为高电平;
  • 起始位:先发出一个逻辑“0”,表示消息帧的开始;
  • 数据位:紧接着起始位之后,可由5~8位组成,通常传输8位即一个字节。先发送数据的低位,后发送数据的高位;
  • 奇偶校验位:紧接着数据位后面(可有可无),使得“1”的位数应为偶数(偶校验)或奇数(奇校验),校验数据传输是否正确;
  • 停止位:它是消息传输结束的标志,它可以是1位、1.5位、2位的高电平, 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
  • 波特率:是衡量数据传输速率的指标,表示每秒钟传输的位数。例如设置串口的波特率为9600,则表示是1s传输9600个bit的数据,则传送每个位的时间为 1s / 9600 ≈ 104us,从而区分消息帧中每个位传输的数据;

假如从A设备通过串口传输“Hi”给设备B,参数为:波特率9600,无校验位,停止位1位
查询ASCLL表知道 ‘H’对应的二进制表示 0100 1000,‘i’对应的二进制表示 0110 1001,发送效果如下图所示:

设备A和设备B按照约定的波特率,设备A从start开始,每经过104us向设备B发送一个bit,同时设备B每经过104us向设备A接收一个bit的数据,从而实现数据的传输。
缺点:UART一般直接使用TTL信号来表示0和1,但TTL信号抗干扰能力较差,数据在传输过程中很容易出错;且TTL信号的通信距离也很短;

三、RS-232、RS-422、RS-485通信协议

UART只是对信号的时序进行了定义,而未定义接口的电气特性。
RS-232、RS-422和RS-485标准最初都是由美国电子工业协会制定并发布的。

1、RS-232协议

  1. 现在工业控制的RS-232接口一般只使用RXD、TXD、GND三条线,且PC机一般采用DB-9连接器;
  2. 特性:
  • 工作方式:单端(非平衡);
  • 节点数:点对点通讯(1收1发);
  • 最大传输距离:50ft ( 50 * 0.3048 = 15.24m);
  • 最大传输速率:20kbit/s;
  • 连接方式:点对点(全双工);
  • 电气特性:-3V ~ -15V表示逻辑1,3V ~ 15V表示逻辑0;
    常用芯片有max232、SP232等
    缺点:通信距离短,速率低,而且只能点对点通信,无法组建多机通信系统,且容易受外界电气干扰导致信息传输错误。

2、RS-422协议

RS-422标准定义了一种平衡通信接口,改变了RS-232标准的单端通信的方式,总线上使用差分电压进行信号传输。传输速率提高到10Mbit/s,传输距离长达4000ft=1219.2m(速率低于100kbit/s时),而且运行总线上最多连接10个接收器。

  1. 特性:
  • 工作方式:差分(平衡);
  • 节点数:点对多通讯(1发10收);
  • 最大传输距离:4000ft ( 4000 * 0.3048 = 1219.2m);
  • 最大传输速率:10Mbit/s;
  • 连接方式:一点对多点(四线制,全双工);
  • 电气特性:2V ~ 6V表示逻辑1,-2V ~ -6V表示逻辑0;
    缺点:连接的设备少,抗干扰能力不强,无法完全满足工业需求。
    常用芯片有max232、SP232等

2、RS-485协议

RS-485标准运行连接多个收发器,即具有多站能力,增加了多点、双向的通信能力。

  1. 特性:
  • 工作方式:差分(平衡);
  • 节点数:点对多通讯(1发32收);
  • 最大传输距离:4000ft ( 4000 * 0.3048 = 1219.2m);
  • 最大传输速率:10Mbit/s;
  • 连接方式:多点对多点(两线制,半双工);
  • 电气特性:2V ~ 6V表示逻辑1,-2V ~ -6V表示逻辑0;
    常用芯片有max485、SP3072EEN等,以SP3072EEN收发器芯片的典型应用电路如下

    一主多从效果图:

在RS-485总线网络基础下制定的Modbus应用层通信协议可参考传感网应用开发(中级)网络协议报文详解

四、CAN通信协议

CAN(Control Area Network,控制器局域网)由德国Bosch公司于1983年开发出来,最早被应用于汽车内部控制系统的监测与执行机构间的数据通信,目前是国际上应用最广泛的现场总线之一。

1、CAN总线具有以下主要特性:

  • 数据传输距离远(最远10km);
  • 数据传输速率高(最高数据传输速率1Mbit/s);
  • 具备优秀的仲裁机制;
  • 使用筛选器实现多地址的数据帧传递;
  • 借助遥控帧实现远程数据请求;
  • 具备错误检测与处理功能;
  • 具备数据自动重发功能;
  • 故障节点可自动脱离总线且不影响总线上其它节点的正常工作;

2、 CAN技术规范与标准

  • ISO 11898标准的CAN通信数据传输速率为125kbit/s~1Mbit/s,适合高速通信应用场景;而ISO 11519标准的CAN通信数据传输速率为125kbit/s以下,适合低速通信应用场景。
  • CAN技术规范主要主要对OSI基本参考模型中的物理层(部分)、数据链路层和传输层(部分)进行了定义。

3、CAN总线报文信号和网络拓扑

ISO 11898在静态时两条信号线上电平电压均为2.5V左右(电位差0V),此时的状态表示1(称为“隐性电平”状态),当CAN_H上的电压值为3.5V且CAN_L上的电压值为1.5V时,两线的电位差为2V,此时的状态表示逻辑0(称为“显性电平”状态)。
ISO 11519标准在静态时,当CAN_H上的电压值为4.0V且CAN_L上的电压值为1.0V时,两线的电位差为3.0V,,此时的状态表示0(称为“显性电平”状态),当CAN_H上的电压值为1.75V且CAN_L上的电压值为3.25V时,两线的电位差为-1.50V,此时的状态表示逻辑1(称为“隐性电平”状态)。

CAN总线网络拓扑图如下:
高速CAN总线ISO 11898网络被应用在汽车动力与传动系统,它是闭环网络,总线最大长度是40m,求端各有一个120Ω的电阻。
低速CAN总线ISO 11519网络被应用在车身系统,它的两根总线是独立的,不形成闭环,要求每根总线上各串联一个2.2kΩ的电阻
传输介质可用双绞线、同轴电缆和光纤。

4.、CAN通信帧的介绍

(1)数据帧

用途:用于发送单元向接收单元传送数据

  1. 数据帧由7个段构成
  • 帧起始,表示数据帧和远程帧的起始,他仅由一个“显性电平”位组成。
  • 仲裁段,是表示帧优先级的段。标准帧的仲裁段由11bit的标识符ID和RTR(远程发送请求)位组成;扩展帧的仲裁段由29bit的标识符ID、SRR(替代远程请求位)、IDE位和RTR为构成。
  • 控制段,是表示数据的字节数和保留位的段,标准帧与扩展帧的控制段格式不同。
  • 数据段,用于承载数据的内容,它包含0~8B的数据,从MSB(最高有效位)开始输出。
  • CRC段,是用于检查帧传输是否错误的段,它由15bit的CRC序列和1bit的CRC界定符(用于分隔)构成。
  • ACK段,是用于确认接收是否正确的段,它由ACK槽和ACK界定符(用于分隔)构成,长度为2bit
  • 帧结束,用于表示数据帧的结束,它由7bit的隐性位构成。

(2)遥控帧

用途:用于接收单元向具有相同ID的发送单元请求数据。

(3)错误帧

用途:用于当检测出错误时向其他单元通知错误。

(4)过载帧

用途:用于接收单元通知发送单元其尚未做好接收准备。

(5)帧间隔

用途:用于分隔数据帧和遥控帧的帧。
帧间隔的构成元素有三个:
一是间隔,它由3bit的隐性位构成。
二是总线空闲,它由隐性电平构成,且无长度限制。只有在总线处于空闲状态下,要发送的单元才开始访问总线。
三是延迟传送,它由8bit的隐性位构成。

五、I2C通信协议

1、总线简介

IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步。

2、IIC通信过程

  1. 主机发送起始信号启用总线;
  2. 主机发送一个字节数据指明从机地址和确定后续主机从机的传递方向
  3. IIC总线上各从机判断主机发送的从机地址是否是自己,匹配的从机发送应答信号回应主机;
  4. 发送器发送一个字节数据;
  5. 接收器发送应答信号回应发送器;
  6. …(循环重复步骤4、5);
  7. 最后通信完成后主机发送停止信号释放总线;

IIC总线发送和停止时序图:

IIC总线发送数据时序图:

3、IIC典型时序

  1. 主机向从机发送数据
  2. 从机向主机发送数据

    3.主机先向从机发送数据,然后从机再向主机发送数据

六、SPI通信协议

1、SPI总线的简介

SPI是由摩托罗拉公司开发的高速全双工同步串行通信协议(一主多从)。 有点类似IIC,但又与IIC选通从设备的方式不同,IIC是通过发送从机地址来选通从机,而SPI是通过拉低连接到从机的NSS引脚对从机进行选通的。

SPI一般应用由四个引脚组成(一主多从):

  • SCLK(Serial Clock):串行时钟,由主机发出;
  • MOSI(Maser Output,Slave Input):主机输出从机输入信号,由主机发出;
  • MISO(Master Input,Slave Output):主机输入从机输出信号,由从机发出;
  • NSS(Slave Selected):选择信号,由主机发出,一般是低电位有效。
    SPI主从连接如图所示:

2、SPI通信的过程

SPI是串行通信协议,但是主机占用的引脚明显比IIC和UART多,而主机引脚数会随着从机数量增多而增多。主机在通过MOSI数据线发送数据的同时,从机也会通过MISO将数据传输给主机(收发同时进行),它们以虚拟似缓形拓扑连接。数据通常先移出最高位,在时钟边沿,主机和从机均移出一位,然后在传输线上输出给对方(改变数据)。在下一个时钟沿,主从设备的接收器都从传输线接受该位,并设置为移位寄存器的新的最低有效位(采样数据)。在完成这样一个移出一移入的周期后,主机和从机就交换了寄存器中的一位,传输可能会持续任意数量的时钟周期。传输完成后,主设备会停止时钟信号,并拉高NSS选通线。

有关【嵌入式物联网常用的通信协议UART、RS-232、RS-422、RS-485、CAN、IIC、SPI】的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. 电脑怎么截图?进来看(8种常用截图方法) - 2

    电脑上可以截取图片吗?如果可以,该如何操作呢?相信很多小伙伴都只知道一两种截图的方式,知道的并不全面。其实,电脑上有多种方式截图的,而且非常方便。电脑怎么截图?今天我们就来教大家如何使用电脑截取图片的8种常用方式!操作环境:演示机型:Delloptiplex7050系统版本:Windows10方法一:系统自带截图具体操作:同时按下电脑的自带截图键【Windows+shift+S】,可以选择其中一种方式来截取图片:截屏有矩形截屏、任意形状截屏、窗口截屏和全屏截图。 方法二:QQ截图具体操作:在电脑登录QQ,然后同时按下【Ctrl+Alt+A】,可以任意截图你需要的界面,可以把截图的页面直接下载,

  3. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  4. Unity常用文件夹 - 2

    1.Scenes游戏场景文件夹用于放置unity的场景文件 2.Plugins插件文件夹用于放置unity的依赖文件,例如dll 3.Scripts脚本文件夹用于放置unity的c#脚本文件 4.Resources游戏资源文件夹用于放置unity的各种游戏资源,比如images,prefabs,同时只有放到Resources文件夹的游戏资源才能使用Resource.load(资源路径不加后缀)加载到游戏内存中进行使用 5.EditorUnity编辑器扩展脚本文件夹usingUnityEditor;这个名称空间就是Unity编辑器的名称空间这个名称空间提供了扩展Unity编辑器的各种类 【你所有

  5. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  6. Spark的常用SQL日期函数 - 2

    一、获取当前时间1、current_date当前日期(年月日)Examples:SELECTcurrent_date;2、current_timestamp/now()当前日期(时间戳)Examples:SELECTcurrent_timestamp;二、从日期字段中提取时间1、year,month,day/dayofmonth,hour,minute,secondExamples:SELECTyear(now());其他的日期函数以此类推month:1day:12(当月的第几天)dayofmonth:12hour,minute,second:分别对应时分秒2、dayofweek、dayofm

  7. 嵌入式Linux入门-彻底理解UART串口,手把手教你写程序 - 2

    UART串口这个东西,是嵌入式学习上避不开的,不仅在调试中经常用到,还有很多模块通过串口与SOC相连。这篇文章让你彻彻底底,搞明白串口程序的编写。没有基础的先看:嵌入式Linux学习系列全部文章:嵌入式Linux学习—从裸机到应用教程大全 目录1.UART串口1.1UART硬件连接1.2UART软件通信协议2.读手册,编程序2.1找对应引脚2.2设置GPIO为UART功能2.3设置UART(初始化)2.4编写发送接收函数3.完整代码和验证1.UART串口全称:通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter,简称UART)是一种串行异步收发

  8. ruby - 将异常处理作为 Ruby 中的常用方法 - 2

    有人能告诉我有没有办法将异常处理作为一种通用方法并在方法中使用它?让我进一步解释一下。例如我有以下方法defadd(num1,num2)beginnum1+num2rescueException=>eraiseeendenddefdivide(num1,num2)beginnum1/num2rescueException=>eraiseeendend如您所见,尽管我的方法只需要一行,但由于异常处理代码,该方法变得更大了。我正在寻找的是一个更slim的解决方案,比如(只是一个想法)defadd(num1,num2)num1+num2unlessraise_exceptionenddefd

  9. javascript - Rails : POST 422 (Unprocessable Entity) in Rails? 由于路线或 Controller ? - 2

    我正在尝试为我网站上的用户提供“积分”或“积分”,以发布有关品牌名称的推文。我在适当的View上有漂亮的Twitter小部件...Tweetwindow.twttr=(function(d,s,id){vart,js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id))return;js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);returnw

  10. ruby - 在 Ruby 中读取文件的常用方法有哪些? - 2

    在Ruby中读取文件的常用方法有哪些?例如,这是一种方法:fileObj=File.new($fileName,"r")while(line=fileObj.gets)puts(line)endfileObj.close我知道Ruby非常灵活。每种方法的优点/缺点是什么? 最佳答案 如果文件不是太长,最简单的方法是:putsFile.read(file_name)确实,IO.read或File.read会自动关闭文件,因此无需使用File.openblock。 关于ruby-在Ruby中

随机推荐