基本方式简介:
GPIO通用输入输出,具有输入缓冲功能,输出锁存功能,有三态:0态、1态、高阻态。
UART通用异步收发器,标准串口通信接口,字符格式按照低位在前、高位在后次序进行传输,1位起始位,5~8位数据位,1位奇偶校验位,1~2位停止位。可完成全双工的串行异步通信,外接电平和逻辑转换收发器可做成RS232、RS422、RS485等标准串行接口。交叉连接方式,需要三根线。
I2C是集成电路互联的一种总线标准,只有两根线,一根时钟线SCL,一根数据线SDA,短距离低速通信,有起始位和终止位,同步半双工通信方式。SDA上的数据必须在高电平周期保持稳定,而它的高低电平变换只有在SCL低电平时才被允许。
I2S音频设备之间的数据传输。
SPI,总线系统是一种同步串行外设接口,通可以通过MCU与各种外围设备进行通信,通常四根线包括MISO(主输入从输出)MOSI,SSL(芯片选择),SCK(时钟),全双工的同步通信,用于板级芯片之间的短距离通信。移位寄存器。
CAN,控制器局域网,仅有CANH、CANL,采用差分传输方式,远距离抗干扰多主多从工业控制领域。其数据帧由七个域构成:帧起始、仲裁帧、控制域、CRC域、应答域、帧结尾,数据域的长度可选为0~8B。
USB,通用串行总线,差分传输,与外部设备的短距离通信。
以太网。
之间的区别:
UART 通用异步串行口,速率不快,可全双工,结构上一般由波特率产生器、UART发送器、UART接收器组成,硬件上两线,一收一发。
SPI 高速同步串行口,高速,可全双工,收发独立,同步接口,可实现多个SPI设备互联,硬件3~4线。
I2C 双向、两线、串行、多主控接口标准。速率不快,半双工,同步接口,具有总线仲裁机制,非常适合器件间近距离经常性数据通信,可实现设备组网。
USB 通用串行总线,高速,半双工,由主机、hub、设备组成。设备可以与下级hub相连构成星型结构。
RS232,使用UART的电平转换成RS232电平通信距离可达到15m,一般双工三线交叉连接,一主一从。
RS485,RS232无法消除共模干扰,传输距离较短。RS485采用差分信号传输模式,半双工,两线,一主多从。
CAN,RS485不能构成多主多从的模式,也就是说同一时刻不能有两个或两个以上的系统处于发送状态。CAN总线也采用差分传输,内置CRC校验,传输可靠性强,多主多从。
Modbus简介:http://www.cnblogs.com/luomingui/archive/2013/06/14/Modbus.html
Modbus可以支持多种电气接口,如RS-232、RS-485等,在ModBus系统中有2种传输模式可选择。这2种传输模式与从机PC通信的能力是同等的。选择时应视所用ModBus主机而定,每个ModBus系统只能使用一种模式,不允许2种模式混用。一种模式是ASCII(美国信息交换码,以ASCII模式发送),另一种模式是RTU(远程终端设备,直接以数字发送)。
用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。在其它网络上(像MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。
在RTU代码系统8位二进制,十六进制数0...9,A...F
消息帧中的每个8位域:都是一或两个十六进制字符组成
每个字节的位:1个起始位,8个数据位,最小的有效位先发送,1个奇偶校验位,无校验则无,1个停止位(有校验时),2个Bit(无校验时)
1、如下一段为ModBus写单个寄存器消息帧的解读:
01 06 03 04 00 08 C9 89 ,其中8位的设备地址01,8位的功能代码06(代表写入单个寄存器),n位的数据(数据区必需包含要读取寄存器的起始地址及读取长度,这里0304代表写入寄存器的起始地址,0008代表写入的数据大小),16位的CRC校验码(C9 89)。
2、如下一段为ModBus读寄存器消息帧的解读:http://www.cnblogs.com/zfyouxi/p/3762366.html
读可读写模拟量寄存器:
发送命令(主机向从机)格式:
[设备地址] [命令号03] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]
例:[11][03][00][6B][00][03][CRC低][CRC高]
意义例如以下:
11:设备地址,样例中的地址是11,溶氧传感器端默认的地址是1,。
03:读模拟量的命令号固定为03,这是Modbus协议规定的。
00、6B:起始地址高8位(00)、低8位(6B):表示想读取的模拟量的起始地址,比方样例中的起始地址为107。这个006B表示一个完整的地址,注意这里的地址是高8位在前,低8位在后。
00、03:寄存器数高8位(00)、低8位(03):表示从起始地址開始读多少个模拟量(返回的每个模拟量是用两个字节表示的)。样例中为3个模拟量。注意,在返回的信息中一个模拟量须要返回两个字节同一时候这里的地址也是高8位在前,低8位在后。
[CRC低][CRC高]:帧尾的CRC-16校验,尤其须要注意的一点是校验结果的低8位在前,高8位在后,这个顺序不同于起始地址以及读取深度的地址顺序。
设备响应:[设备地址] [命令号03] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8位] [CRC校验的高8位]
例:[11][03][06][02][2B][00][00][00][64][CRC低][CRC高]
意义例如以下:
11:设备地址(从机地址)。
03:命令号。
06:返回的字节个数(不高扩两字节的校验码):表示数据的字节个数,也就是数据1,2...n中的n的值。样例中返回了3个模拟量的数据,由于一个模拟量须要2个字节所以共6个字节。
数据1...n:当中[数据1][数据2]各自是第1个模拟量的高8位和低8位,[数据3][数据4]是第2个模拟量的高8位和低8位,以此类推。样例中返回的值各自是555,0,100。
[CRC低][CRC高]:CRC校验同上。