常用的协议方式
常用的协议方式包括UART、SPI、I^2C、RS232、RS485。UART俗称串口通信,初始化后只需要一行代码就可以给其他设备发送内容了。物理层就是两根线,一根发送,一根接收,双方约定好接收的速度例如9600bps,然后给对方发送数据,一次发送8位,也就是一个字节的数据,两边可以同时发送给对方。
存在三个缺点:
因此衍生了其他的通信方式,针对第一点例如RS232、RS485。
RS232最大通信距离可以支持30米左右(网线交换机和各个设备,如主机、服务器等),RS485(双绞线连接电源的服务器)最大通信距离可以超过1千米,RS485增加了一对多的通信功能。
第二点针对通讯方式慢,我们使用SPI接口。
通常的UART速度一个小时写不满一张64M的SD卡。原因是需要双方约定波特率,早期单片机频率低、时钟精度的问题,所以双方波特率不可能完全一致。
解决问题的方法就是加入一个clock信号(SPI接口),双方不需要约定具体的通信速度,clock同时给一个上升沿,接收端收到上升沿信号后就去数据线上拿数据,这样就不依赖系统时钟的准确度了。所以SPI的最高通讯速率可以突破10M,像SD卡和屏幕对于通讯速度有要求的外设,很多都会使用SPI接口。
第三点针对无法多通信,我们使用IIC协议(I方C)。
如果一个系统有很多个传感器,那么需要多个串口去挨个连接,这样就很浪费资源,因此有了I方C,I方C支持多设备互相通信。
I方C有两根线,数据线和clock,连接多个设备,每个设备都有自己的ID,系统通过ID给设备发送指令,上传对应的数据。
I^2C与UART相比,大大降低了PCB的布线成本和节约单片机IO资源。
IIC为了解决多设备共用总线而不烧毁电路的问题,采用了开漏输出的方案,配合上拉电阻就可以完整的输出高低电平。上拉电阻的取值一般在几千Ω,例如4.7KΩ。总线设备多,且通信速度要求高的话,电阻就小一些,反之电阻就大一些。因为采用了开漏输出+上拉电阻的模式,所以IIC信号的抗干扰能力较弱,只适合同一块电路板上的芯片互相通信,不适合超过30cm电路板的通信。
IIC的具体通信协议
主从模式
为什么在SCL和SDA上加上拉电阻,多大的上拉电阻合适?因为在SCL和SDA的引脚中,NMOS导通时输出低电平,但关断时电平是不确定的,因此需要上拉电阻。加入上拉电阻后,当NMOS关断时,NMOS为高阻状态,上拉电阻的电压让输出呈现高电平。
如果上拉电阻的阻值设计的太大,IIC总线驱动能力降低,从高电平供电速度减缓,影响IIC的时序,可能出现误码。如果上拉电阻的阻值设计的太小,当NMOS导通为低电平时,通过的电流就会变差。同时,I/O口电流过大可能烧坏芯片。一般要求IIC引脚低电平时,流过IIC引脚的电流小于3mA。
如果是3.3V上拉的话,VOL是IIC引脚的为低电平时的最大电压,通常为0.4V,可以计算上拉电阻的下限R。Cl为IIC的的等效负载电容。上拉电阻一般大于1KΩ,小于10KΩ。
而在SCL和SDA上加电阻,是为了阻抗匹配,降低反射。
232和485通信的区别
1. 传输方式
- RS-232: 采取不平衡传输方式,即所谓单端通讯。收、发端的数据信号是相对于信号地的电平。
- RS-485: 采用平衡发送和差分接收,因此具有抑制共模干扰的能力。
2. 传输距离
- RS-232: 适合本地设备之间的通信,传输距离一般不超过20m。
- RS-485: 在要求通信距离为几十米到上千米时,广泛采用。最大传输距离标准值为4000英尺,实际上可达3000米。
3. 支持设备数量
- RS-232: 只允许一对一通信。
- RS-485: 具有多站通讯能力,在总线上是允许连接多达128个收发器。
4. 数据传输速率
- RS-232: 最高传输速率为38400bps。
- RS-485: 数据最高传输速率为10Mbps。
5. 通信方式
- RS-232: 可以同时发送数据和接收数据,即所谓的全双工。需要至少3根信号线(RX、TX、GND)。
- RS-485: 是半双工通信,每次只能作发送或者只能作接收。通常只需要2根信号线(A、B)。
6. 抗干扰能力
- RS-232: 抗干扰能力较差。
- RS-485: 具有较强的抗共模干扰能力,即抗噪声干扰性好。
7. 电气特性
- RS-232: 信号电平值较高,易损坏接口电路的芯片,不兼容TTL电平,需要使用电平转换电路。
- RS-485: 信号电平比RS-232降低了,不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。
8. 接口物理结构
- RS-232: 可以采用9个引脚(DB-9)或是25个引脚(DB-25)的型态出现。
- RS-485: 无具体的物理形状,根据工程的实际情况而采用的接口。
Modbus 通信协议详解
一、Modbus 协议简介
Modbus 协议是应用于电子控制器上的一种通用语言。标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。
主设备可单独和从设备通信,也能以广播方式和所有从设备通信。
如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。
从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。
二、两种传输方式
控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
ASCII模式
: | 地址 | 功能代码 | 数据数量 | 数据1 | ... | 数据n | LRC高字节 | LRC低字节 | 回车 | 换行 |
RTU模式
地址 | 功能代码 | 数据数量 | 数据1 | ... | 数据n | CRC低字节 | CRC高字节 |
所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。
在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。
三、Modbus消息帧
两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。
1、ASCII帧
使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。
其它域可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。
消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。一个典型消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 | LRC校验 | 结束符 |
1个字符 | 2个字符 | 2个字符 | n个字符 | 2个字符 | 2个字符 |
图2 ASCII消息帧
2、RTU帧
使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:
起始位 | 设备地址 | 功能代码 | 数据 | CRC校验 | 结束符 |
T1-T2-T3-T4 | 8Bit | 8Bit | n个8Bit | 16Bit | T1-T2-T3-T4 |
图3 RTU消息帧
四、实例解读
以(0x01)读取线圈为例。
主机发送:07 01 00 00 00 08 3D AA
从机回复:07 01 01 20 50 D8
解析如下:
07(从设备地址) 01(功能码) 00 00(起始地址16bit,高位在前,低位在后) 00 08(寄存器数16bit 高位在前,低位在后) 3D AA (CRC校验)
07(从设备地址) 01(功能码) 01(数据域字节数) 20(数据 1) 50 D8(校验)