通信的几种方式与介绍
通信目的:将一个设备的数据传送到另一个设备,扩展硬件系统
通信协议:制定通信的规则,通信双方安装协议规则进行数据收发
- USART引脚为TX和RX,TX是数据发送脚,RX是数据接受脚
- I2C通信引脚是SCL和SDA,SCL是时钟,SDA是数据
- SPI的通信引脚,SCLK是时钟,MOSI是主机输出数据脚,MISO是主机输入数据脚,CS是片选,用于指定通信对象。
- CAN通信的两个引脚是差分数据脚。
- USB通信的两个引脚也是差分数据脚。
通信引脚:
前三个由于是单端通信,通信双方必须共地,所以通信引脚应该再加上GND引脚。
双工:
一般有两个通信引脚的都是全双工,串口就是一根TX发送,一根RX接收,而USB和CAN是两根数据引脚组合成一根通过差分信号进行数据发送。
单工:
数据只能从一个设备到另一个设备。
时钟:
时钟可以分为同步和异步,同步通信就是通过时钟信号告诉接收方什么时候过来采集数据,I2C和SPI有单独的时钟线,所以是同步的,接收方可以在时钟信号的指引下进行采样。
剩下串口,CAN,USB没有时钟线,就需要双方约定一个采样频率,并且还要加一些帧头帧尾等,进行采样位置的对齐。上面三个都是单端信号,也就是引脚的高低电平都是对GND的电压差。所以都需要共地,差分信号在通信的时候不需要GND,使用差分信号可以抗干扰特,一般传输距离和速度都比较好。
设备:
点对点只能两个设备进行通信,多设备则需要一个寻址的过程,确定通信的对象。
常见的通信设备:
左边为USB转串口模块,它板载的CH340芯片能将串口通信转化为USB通信方式。
中间是蓝牙模块,引脚为串口通信引脚,可以通过蓝牙芯片与手机互连。实现手机与单片机通信进行遥控。
右边是陀螺仪模块,左边是串口引脚,右边是I2C引脚。
串口通信电路:
- 简单双向串口通信有两根通信线(发送端TX和接收端RX)
- TX与RX要交叉连接当只需单向的数据传输时,可以只接一根通信线变为单工通信
- 当电平标准不一致时,需要加电平转换芯片,一般都是TTL电平
电平标准:
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
- TTL电平:+3.3V或+5V表示1,0V表示0
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
串口标准:
数据转换关系:
- bit就是位,也叫比特位,是计算机表示数据最小的单位
- byte就是字节
- 1byte=8bit
- 1byte就是1B表示1字节
- 1个字符=2字节
- 1KB=1024B
- 字节就是Byte,也是B
- 位就是bit也是b
- 转换关系如下:1KB=1024B,1B= 8b
串口数据帧结构:
如图串口数据帧结构,这就是串口发送一根字节的格式,串口中每个数据都装在一个数据帧里面,每个数据帧都包括一个起始位,数据位,停止位组成,还可以在数据帧的最后加一个奇偶校验位。这样数据位总体就是9位,有效载荷为前8位代表一个字节。
数据传输原理:
首先需要约定波特率,串口是异步通信,波特率是约定的速率,波特率的单位是码元/s,还有一种叫法为比特率,比特率单位是bit/s,或者叫bps,在二进制调制的情况下,波特率就是比特率,一个码元就是1bit,单片机一般都为二进制调制,所以也可以叫比特率。若规定波特率为1000bps,那就表示1s要发送1000位,每一位的时间就是1ms,传输1字节(byte)的时间就是起始位加上数据位加上停止位为10ms,根据转换关系速率为100B/s,约等于0.1KB/s
当没有数据传输时为空闲状态,数据线为高电平,开始传输数据时,需要先发送一个起始位,这个起始位必须为低电平,打破空闲状态的高电平,产生下降沿,也就告诉数据接收放我要开始传输这一帧的数据了。如果没有起始位,当传输8个1数据的时候,电平始终为高电平。同样的在1个字节数据发送完成后,必须要有一个停止位,这个停止位用于数据帧间隔,固定为高电平,同时停止位也是为下一个起始位做准备。
数据位为低位先行,当传输一个数据为0x0F(0000 1111)的时候,发送时候为低位先发就是1111 0000这样发送。
校验位主要是验证数据的准确性,分为无校验,奇校验,偶校验,如果采用奇校验,那么所有的数据帧里的1的个数都是奇数个1,例如传输1111 0000时,校验位就会补1,也就是111100001,偶校验同理。接收方会根据这个校验来验证数据是否准确。如果传输中有一个位置因为干扰由0变为1,那么接收方验证后就会认为传输出错,就可以选择丢弃或者要求重传。当有两位数字同时出错,那么采用这两种校验方法就不会检查出错误。如果想要提高检出率,可以了解CRC校验,STM32也内置了CRC校验外设。
串口总结:
- 波特率:串口通信的速率
- 起始位:标志一个数据帧的开始,固定为低电平
- 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
- 校验位:用于数据验证,根据数据位计算得来
- 停止位:用于数据帧间隔,固定为高电平
串口波形图: