串口通信在嵌入式领域使用非常广泛,如3G、4G、5G、NB-iot、Lora等几乎都是。因此,做嵌入式开发人员很有必要学习一下。
首先要了解计算机的通信方式,通过硬件发出的高、低电平,计算机处理0、1数字信号,完成通信。
一、串口通信介绍
1、串口接头
常用的串口接头有两种,一种是9针串口(简称DB-9),其中三根(GND(地线)、TXD(输出)、RXD(输入))非常重要,其他六根一般是用来做流控的,而我们平常的测试中一般用不上。还有一种是25针串口(简称DB-25)
如图,带针状的是公头,带孔状的是母头。购买串口接头的时候需要注意自己需要的是公还是木哦
2、串口通信连线
串口通信最少通过两根线(GND和信号线)就可以完成单工通信。大多数的串口通信都是三根线(GND、RXD、TXD)来实现的双工通信。
3、串口通信的方式通常为异步串行通信
关于异步和同步通信:
同步通信:有时钟,如SPI,I2C通信
异步通信:无时钟,如UART
关于串行和并行:
串口通信即可以实现半双工,也可以实现全双工
单工:数据传输只支持数据在一个方向上传输
半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输
全双工:允许数据同时在两个方向上传输
4.串口通信电平
串口通信电平中,常用的便是TTL电平和RS232电平。电平信号是用信号线减去参考线(GND)电平得到的电压差,这个电压差决定了传输值是1还是0。电平信号中多少V代表1或0是不固定的,取决于电平标准。
TTL是MUC或芯片电平,高电平时5V(51单片机)或3.3V(ARM)表示1,低电平表示0;
RS232电平时用-15V~-3V表示1,+3V~+15V表示0;
显然,TTL电平能接收的误差范围很小,适合近距离且干扰小的情况,如开发板芯片到芯片之间、开发板与串口模块之间的短距离串口通信。而设备与设备之间的长距离通信,因为降压和信号干扰等原因通常会用RS232电平进行通信,但通信距离也一般小于15米。
二、串口通信协议(UART)
1、UART
(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,在UART通信中,发送端的UART将来自控制设备(如CPU)的并行数据转换为串行数据,以串行方式将其发送到接收端的UART
,然后由接收端的UART将串行数据转换为并行数据以用于接收设备的正常处理。
2、UART数据包
每个数据包包含1个起始位,5~9个数据位(设置校验位时,最多8个数据位;没设置校验位时,校验位也算一个数据位,故最多9个数据位),一个可选的奇偶校验位以及1个或2个停止位,如下图:
起始位:
表示要发送一个通信单元,UART数据传输线通常在不传输数据时保持在高电平。为了开始数据传输,发送端UART在一个时钟周期内将传输线从高电平拉低到低电平。此时接收端UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据位中的每一位数据。
数据位:一个通信单元的有效信息位,本次通信要发的有效数据,一次发送多少位是由串口编程设定的,一般选8位,因为ASCII码中一个字符刚好编码为8位。
校验位:
校验数据位,防止数据为出错。常用的两种校验方式是奇校验和偶校验。
奇校验:保证1的个数为奇数,如3位数据传输中1的个数为偶数,则校验位为1
偶校验:保证1的个数为偶数,如3位数据传输中1的个数为偶数,则校验位为0
以011的奇偶校验为例:
停止位:
发送方用来表示本通信单元结束的标志,停止位的位数也是由串口编程设定的,由通信线上的电平变化来反映(从低电压驱动到高电压)。常用的有1、1.5或2位停止位,一般用1位。
波特率:
波特率是串口数据的传输速度,即Bit/s
,常见的波特率有:9600,19200,38400,57600,115200等。因为串口通信是一种异步通信,没有同步时钟信号来规约一个bit的数据发送电平维持多长时间。因此,收发双方的速率必须保持一致来同步收发数据,否则会出现乱码或完全接收不到数据的情况。
3、UART优缺点
优点
两条数据线就能通信;异步通信,无需时钟信号;有奇偶校验位,方便通信的差错检查;接收端和发送端设置好数据包结构,即可稳定通信;
缺点
数据帧最大支持9位数据;不支持多主机或多从机的主从系统(如I2C);
4、串口通信总结
串口通信是异步通信,因此通信双方必须事先约定好通信参数。这些通信参数包括:数据位、校检位、停止位、波特率,这些参数都不能设置错误,否则都会导致通信失败。如波特率调错了,发送方发送数据没问题,接收方能接收到数据,但是会乱码。
三、串口编程
关于串口编程及封装的具体代码实现,可移步Linux串口编程及封装_Troye .的博客-CSDN博客_linux 串口封装