目录
一、通讯的基本知识
1、串行通讯与并行通讯
2、 全双工、半双工及单工通讯
3、 同步通讯与异步通讯
4、通讯速率
二、串口通讯
1、物理层:
2、协议层:
3、STM32代码中使用过程串口步骤:
一、通讯的基本知识
1、串行通讯与并行通讯
根据数据传送的方式,通讯可分为串行通讯与并行通讯;
(1) 串行通讯:是指设备之间通过少量数据信号线(一般是8 根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式;
(2) 并行通讯:并行是指多比特数据同时通过并行线进行传送,一般使用8、16、32 及64 根或更多的数据线进行传输的通讯方式;
(3) 串行通讯与并行通讯比较:
特性 | 串行通讯 | 并行通讯 |
通讯距离 | 较远 | 较近 |
抗干扰能力 | 较强 | 较弱 |
传输速率 | 较慢 | 较高 |
成本 | 较低 | 较高 |
并行通讯使用多个信号线,可以同时传输多个数据位的数据;而串行通讯只有一个信号线,同一时刻只能传输一个数据位的数据。
2、 全双工、半双工及单工通讯
根据数据通讯的方向,通讯又分为全双工、半双工及单工通讯;
通讯方式 | 通讯线 | 举例 | 说明 |
全双工 | 两根 | SPI、UART | 在同一时刻,两个设备之间可以同时收发数据 |
半双工 | 一根 | IIC | 两个设备之间可以收发数据,但不能在同一时刻进行 |
单工 | 一根 | 某些传感器通讯,比如红外,温湿度传感器等 | 在任何时刻都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接收设备 |
3、 同步通讯与异步通讯
根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用到时钟信号进行简单的区分。
(1) 同步通讯:收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。同步通讯双方的时钟允许误差较小,数据信号所传输的内容绝大部分就是有效数据,一般不用校验位,所以同步通讯的效率更高。
(2) 异步通讯:不使用时钟信号进行数据同步,容易出错,所以它们在数据信号中穿插一些同步用的信号位和校验位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还需要双方约定数据的传输速率,以便更好地同步。异步通讯双方的时钟允许误差较大。
4、通讯速率
衡量通讯性能的一个非常重要的参数就是通讯速率,通常以比特率(Bitrate) 来表示,即每秒钟传输的二进制位数,单位为比特每秒(bit/s)。
波特率和比特率:
容易与比特率混淆的概念是波特率(Baudrate),它表示每秒钟传输了多少个码元。而码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。
如常见的通讯传输中,用0V 表示数字0,5V 表示数字1,那么一个码元可以表示两种状态0 和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通讯传输中,有0V、2V、4V 以及6V 分别表示二进制数00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。
二、串口通讯
1、物理层:
串口通讯的物理层有很多标准及变种,根据通讯使用的电平标准不同,主要有TTL,RS-232,RS-485
通讯标准 | 电平标准(发送端) | 传输距离 | 通讯方式 |
5V TTL | 逻辑1:2.4V - 5V 、 逻辑0:0 ~ 0.5V | 在9600波特率传输距离为2米,一般不超过15米 | 全双工 |
RS-232 | 逻辑1:-15V ~ -3V 、 逻辑0:+3V ~ +15V | 一般可达10~20米 | 全双工 |
RS-485 | RS485采用差分信号负逻辑,即+2v–+6v表示‘0’,-6v–2v表示‘1’。 | 最远可达1200米 | 半双工通信 |
2、协议层:
在串口通讯的协议层中,规定了数据包的内容,它由启始位、数据位、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据;
启始位:由高电平拉低1个逻辑位表示
数据位:有效数据的长度常被约定为5、6、7 或8 位长
校验位:占1个位,有奇校验和偶校验
停止位:由低电平拉高,0.5、1、1.5 或2 个逻辑位表示
波特率:一般使用9600bps/s,或者115200bps/s;波特率越高,数据通信越快,但越不稳定。
3、STM32代码中使用过程串口步骤:
(1) 初始化UART时钟,GPIO时钟;
(2) 初始化TX(复用推挽输出),RX(输入)的GPIO;
(3) 初始化UART: 波特率,起始位,数据位,校验位,停止位;
(4) 使能串口;
(5) 配置串口中断:中断优先级;
(6) 是否开DMA??
(7) 使能串口中断:接收字节中断,空闲中断等;
(8) 编写中断服务函数:
(9) 判断中断标志位,清除中断标志位,读取串口数据。