硬件中可用于通信的有:UART、I2C、SPI、USB、CAN。
一、通信基本概念
1. 通信模式
单工:数据接收方和数据发送方是固定的,数据传输是通过一根信号线实现,数据传输的方向是单一的。
半双工:通信双方既可以作为数据发送方也可以作为数据接收方(接收方和发送方不固定),数据传输是通过一根信号线实现,数据传输的方向可以是双向的(但同一时刻数据传输呈现单一性)。 例如:I2C(SCL 时钟线、SDA 数据线)。
全双工:通信双方既可以作为数据发送方也可以作为数据接收方,数据传输是通过两根信号线实现,任意时刻数据传输方向是双向的。
2. 数据发送顺序
低位先行:先发送低位数据。
高位先行:先发送高位数据。
3. 数据传输方式
串行:通过一根信号线逐个bit逐个bit发送数据
- 传输速度慢
- 硬件成本低,实现简单
- 传输距离远,抗干扰性好(RS485 差分)
并行:通过多根信号线多个bit同时发送
- 传输速度快
- 硬件成本高,实现复杂
- 传输距离近,抗干扰性差(30米内)
4. 电平标准
TTL: 高电平:5V,低电平:0V,传输距离近。
RS232:负逻辑(MAX232) ,高电平: -3V~15V ,低电平:3V~15V。
RS485:差分信号,高电平:A - B > 2V,低电平: A - B < -2V 。
CH340:电平转换芯片(TTL -> USB电平)
5. 同步/异步通信
同步通信:通信双方通过一根共享的时钟信号线规定数据传输的频率。
异步通信:通信双方没有共享时钟信号线规定数据传输频率,通过波特率实现类似同步。
二、UART(串行口)
UART:universal async receiver transmitter,通用异步收发器,全双工、串行、异步。
UART有两个数据线,一个数据线用于传输,一个用于接收,没有时钟线。
- RXD:数据接收信号线
- TXD:数据发送信号线
UART接收发送数据共用一个数据缓冲区------SBUF。(接收,中断;发出,轮询)
串口通信时,串口通信参数:例如 9600 8 N 1
- 波特率(bps):bits per second,每秒传输的bit数量。有2400、4800、9600、115200。
- 8:数据位,8位数据位。
- N:None 无校验,O: Odd 奇校验,E:Even 偶校验。
- 1: 停止位。

奇偶校验: 无法检测偶数个bit出错的问题。
- 奇校验:校验位为'1',若数据位中'1'的个数加上校验位的'1'保持'1'的总个数为 奇数个,则代表奇校验通过。
- 偶校验:校验位'0',若数据位中'1'的个数加上校验位的'0'保持'1'的总个数为 偶数个,则代表偶校验通过。
1.串行口相关函数
1.1 串行口控制寄存器SCON和PCON
当PCON寄存器中的SMOD0(B6)为0时,SCON的SM0、SM1指定串行通信的工作方式。
- SM0(B7)=0,SM1(B6)=1
- 工作方式:方式1。功能:8位UART,波特率可变
REN(B4):允许/禁止串行接收控制位。
- REN=0,允许串行接收;REN=1,禁止接收。
TI(B1):发送中断请求标志位。
- 数据发送结束后,硬件自动置TI=1,向主机请求中断;
- 响应中断后必须软件复位TI=0。
RI(B0):接收中断请求标志位。
- 当串行接收一个8位数据后,硬件自动置RI=1,向主机请求中断;
- 响应中断后必须软件复位RI=0。
PCON寄存器的SMOD(B7):波特率选择位。
- SMOD=1,波特率加倍;SMOD=0,不变。
1.2 定时器/计数器工作模式寄存器TMOD
定时器1作为UART的波特率发生器,通过定时器1工作在模式2的溢出频率决定波特率。
TMOD高4位全部置0选择定时器1。
- M1(B5)=1,M0(B4)=0。
- 模式:8位自动重装载,当溢出时将TH1的值自动装入给TL1。
1.3 定时器/计数器控制寄存器TCON
TR1(B6):定时器T1的运行控制位。
- TR1=1,允许T1开始计数;TR1=0,禁止T1计数。
1.4 中断允许寄存器IE
EA(B7):CPU的总中断允许控制位。
ES(B4):串行口中断允许位。
2. 串口初始化
- 配置串口工作模式(8位UART,波特率可变)
- 允许串口接收数据
- PCON寄存器SMOD0清0,通过SCON寄存中的bit6和bit7指定串口工作方式
- 串口波特率加倍,提升串口数据传输速率
- 配置定时器1工作模式为8位自动重装载
- 向TL1和TH1中装入定时器初值
- 开启定时器1计数
- 允许CPU响应所有中断及允许串口产生中断
定时器1初值计算公式:
2^8 - 2^SMOD * focs / 32 / bps / 12
- SMOD:根据PCON的SMOD置位,只会是0或1。
- focs:硬件上的晶振频率(12M / 11.0592M)
- bps:目标波特率(2400)
3. 串口通信
串口发送------轮询,串口接收------中断(串口中断向量表interrupt 4)。
软件在定义数组存放字符串时,默认存储在芯片上的ROM,但是在串口通信时会产生问题。可以在定义前加xdata,将会存储到芯片外的ROM。
三、主从应答
主机:可以发起通信,对通信具有绝对控制权。
从机:无法发起通信,只能根据主机下发指令完成对应的功能。
UART通信协议:Modbus协议。
主机下发Modbus协议格式指令,从机接收指令并解析,完成对应功能,并给主机回复应答。
Modbus协议格式:
起始位 | 设备地址 | 功能码 | 数据位1 | 数据位2 | 校验位 | 结束位
功能码最高位为数据流向位。0:主机->从机;1:从机->主机。
- 主机->从机:功能码假设传输0x01。
- 从机->主机:其余不变,功能码返回0x81。