通信的专业性概念
(1)同步和异步
-
同步通信:通信双方使用统一的时钟信号进行数据同步,数据传输以数据块为单位
-
异步通信:通信双方没有统一的时钟信号,每个字符独立传输,通过起始位和停止位进行同步
(2)单工、半双工、全双工
-
单工:数据只能单向传输(如广播)
-
半双工:数据可以双向传输,但不能同时进行(如对讲机)
-
全双工:数据可以同时双向传输(如电话)
(3)并行和串行
-
并行通信:多个数据位同时传输,传输速度快但需要多根数据线
-
串行通信:数据位依次逐位传输,传输速度较慢但节省线路资源
(4)电平信号和差分信号
-
电平信号:用信号线与参考地线之间的电压差表示逻辑状态;
-
差分信号:用两根信号线之间的电压差表示逻辑状态,抗干扰能力强;
什么是串行通信
1. 基本定义
串行通信(Serial Communication)是一种数据通信方式,其核心特点是数据位按照时间顺序,在单根数据线上依次逐位传输。与之相对的是并行通信,后者同时传输多个数据位。
2. 核心特征
(1) 逐位顺序传输
-
发送方将数据的各个二进制位(bit)按顺序排列
-
通过单根数据线(或少数几根线)依次发送每个位
-
接收方按相同顺序接收并重新组装数据
(2) 通信线数量少
-
基本配置:最少只需2根线(数据线+地线)即可完成通信
-
标准配置:通常3根线(发送线TxD、接收线RxD、地线GND)
-
相比之下,并行通信需要多条数据线(如8位并行需要8根数据线)
(3) 时间同步要求
-
发送和接收双方必须事先约定数据传输的波特率(每秒传输的位数)
-
每个位的持续时间是固定的:1/波特率 秒
3. 串行通信的分类
(1) 按同步方式分
-
异步串行通信:
-
每个字符(字节)独立传输,包含起始位和停止位
-
无需同步时钟信号,使用起始位实现同步
-
如:UART、RS-232
-
-
同步串行通信:
-
连续传输数据块,使用共享时钟信号同步
-
不需要起始位和停止位,效率更高
-
如:SPI、I2C、USB
-
(2) 按数据传输方向分
-
单工:数据只能单向传输
-
半双工:可以双向传输,但不能同时进行
-
全双工:可以同时双向传输
(3) 按信号类型分
-
电平信号:用电压的高低表示0和1(如TTL、RS-232)
-
差分信号:用两根信号线的电压差表示0和1(如RS-485、CAN)
典型的串行通信标准
| 标准 | 类型 | 特点 | 应用场景 |
|---|---|---|---|
| UART | 异步 | 最基础的串行通信 | 单片机通信、调试 |
| RS-232 | 异步 | 电平标准,距离<15m | PC串口、工业设备 |
| RS-485 | 异步 | 差分信号,距离>1200m | 工业现场总线 |
| I2C | 同步 | 两线制,多主机多从机 | 传感器、EEPROM |
| SPI | 同步 | 全双工,高速,四线制 | Flash、显示屏、ADC |
| USB | 同步/异步 | 高速,即插即用,复杂协议 | 外设连接 |
| CAN | 异步 | 差分信号,高可靠性 | 汽车电子、工业控制 |
串行通信的工作方式
1. 硬件连接方式
(1) 基本连接(3线制) - 最常用
-
GND(地线):提供参考电位,确保两端共地
-
RxD(Receive Data,接收数据线):接收对方发送的数据
-
TxD(Transmit Data,发送数据线):向对方发送数据
单片机A 单片机B TxD --------------------> RxD RxD <-------------------- TxD GND --------------------> GND
(2) 完整连接(9线制) - RS-232标准
除了基本3线外,还包含控制信号线,用于硬件流控:
-
DTR(Data Terminal Ready):数据终端就绪
-
DSR(Data Set Ready):数据设备就绪
-
RTS(Request To Send):请求发送
-
CTS(Clear To Send):允许发送
-
DCD(Data Carrier Detect):载波检测
-
RI(Ring Indicator):振铃指示
DB9接口引脚分配: 1: DCD 2: RxD 3: TxD 4: DTR 5: GND 6: DSR 7: RTS 8: CTS 9: RI
(3) 差分信号连接(2线制) - RS-485标准
-
A+:差分信号正端
-
B-:差分信号负端
-
可支持多设备总线连接
(1)3根线(GND、RxD、TxD)或者9根线 receive、transmit
硬件连接(1)已在上述解读,(2)(3)(4)后续解读
(2)发送方有发送移位寄存器,接收方有接收移位寄存器
(3)数据在发送方和接收方的CPU中都以字节为单位整字节处理
(4)数据在通信线上以位为单位逐个bit的传输
串行通信的主要概念(完善版)
1. 帧格式(Frame Format)详解
(1) 起始位(Start Bit)
-
作用:标志一帧数据的开始,同步接收方
-
电平状态:逻辑0(低电平),持续时间=1个位时间
-
同步原理:从空闲状态(高电平)的下降沿开始,通知接收方"数据来了"
-
必要性:异步通信中,接收方不知道数据何时开始,需要起始位触发
(2) 数据位(Data Bits)
-
位数选择:通常为7或8位(1个ASCII字符或1个字节),也可选5、6、9位
-
传输顺序:先传最低位(LSB),最后传最高位(MSB)
-
常见配置:
-
8位数据:传输完整的字节数据(0-255)
-
7位数据:传输ASCII字符集(0-127)
-
-
数据表示:
例如传输字符 'A' (ASCII 0x41 = 二进制 01000001)
传输顺序:1 → 0 → 0 → 0 → 0 → 0 → 1 → 0 (先LSB)
(3) 奇偶校验位(Parity Bit)
-
目的:简单的差错检测,提高数据传输可靠性
-
校验方式:
-
奇校验(Odd):数据位+校验位中"1"的个数为奇数
-
偶校验(Even):数据位+校验位中"1"的个数为偶数
-
无校验(None):不使用校验位
-
固定1/0:校验位固定为1或0(较少用)
-
-
工作原理:
例:发送数据 0x55 (01010101),含4个"1"
奇校验:校验位=1(使1的总数为5,奇数)
偶校验:校验位=0(使1的总数为4,偶数)
-
局限性:只能检测奇数个位错误,无法检测偶数个位错误,不能纠错
(4) 停止位(Stop Bit)
-
作用:标志一帧数据的结束,提供帧间隔
-
电平状态:逻辑1(高电平)
-
位数选择:1位、1.5位(较少用)、2位
-
功能:
-
提供接收方处理时间
-
确保线路回到空闲状态
-
允许传输过程中的微小时钟偏差
-
帧格式组合示例
常见配置:"8-N-1"格式 ┌───┬──────────┬─────┬─────┐ │ 1 │ 8 │ 无 │ 1 │ │起始│ 数据位 │校验 │停止 │ │位 │ │ 位 │ 位 │ └───┴──────────┴─────┴─────┘ 总位数:1 + 8 + 0 + 1 = 10位
2. 波特率(Baud Rate)深入理解
(1) 严格定义
-
波特率 = 每秒传输的符号(码元)数,单位:波特(Baud)
-
比特率 = 每秒传输的二进制位数,单位:bps(bits per second)
-
在二进制系统中:波特率 = 比特率(1个符号=1个比特)
(2) 波特率计算与误差分析
位时间(Bit Time)= 1 / 波特率 例如:9600波特率 → 位时间 = 1/9600 ≈ 104.17微秒 误差要求:发送与接收波特率误差应 < 2.5%(理想<1%) 误差计算:误差(%) = |(实际波特率 - 设定波特率)| / 设定波特率 × 100%
3. 流控(Flow Control)
流控:速率协商,现在一般都要禁用掉,所以以下内容作为兴趣了解即可
(1) 为什么需要流控?
-
问题:接收方处理速度 < 发送方发送速度 → 数据丢失
-
场景:
-
接收缓冲区满
-
接收方暂时无法处理
-
通信线路拥塞
-
(2) 硬件流控(Hardware Flow Control)
a) RS-232标准流控信号线
text
主要控制线:
┌──────┬──────────────────────────────┐
│ 信号 │ 功能描述 │
├──────┼──────────────────────────────┤
│ RTS │ 请求发送(发送方→接收方) │
│ CTS │ 清除发送(接收方→发送方) │
│ DTR │ 数据终端就绪(DTE→DCE) │
│ DSR │ 数据设备就绪(DCE→DTE) │
└──────┴──────────────────────────────┘
b) RTS/CTS工作流程
text
发送方 接收方
│ │
├─RTS高("我要发数据")───→│
│ │
│←───CTS高("可以发送")────┤
│ │
├─────发送数据──────────→│
│ │
│←───CTS低("暂停发送")───┤ (缓冲区快满)
│ │
├─────暂停发送───────────│
│ │
│←───CTS高("恢复发送")───┤ (缓冲区有空)
│ │
└─────恢复发送───────────→│
c) 硬件流控优缺点
-
优点:
-
实时性好,响应快
-
不占用数据带宽
-
可靠性高
-
-
缺点:
-
需要额外连线(至少4线:TxD、RxD、RTS、CTS)
-
硬件成本增加
-
(3) 软件流控(Software Flow Control,XON/XOFF)
a) 控制字符
text
XON(Transmit On) : 0x11 (Ctrl+Q) - "请继续发送"
XOFF(Transmit Off): 0x13 (Ctrl+S) - "请暂停发送"
b) 工作流程
text
发送方 接收方
│ │
├─────发送数据──────────→│
│ │
│←─────XOFF字符───────┤ (缓冲区快满)
│ │
├─────暂停发送───────────│
│ │
│←─────XON字符────────┤ (缓冲区有空)
│ │
└─────恢复发送───────────→│
c) 软件流控优缺点
-
优点:只需3根线(TxD、RxD、GND)
-
缺点:
-
占用数据带宽(控制字符作为数据发送)
-
控制字符不能出现在数据中(需转义处理)
-
延迟较大(需要字符完整接收后才能响应)
-
(4) 现代串口通信中的流控使用
a) 禁用流控的情况(大多数情况)
// 在串口配置中明确禁用流控
// Windows/Linux串口配置
struct termios options;
options.c_cflag &= ~CRTSCTS; // 禁用硬件流控
options.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用软件流控
适用场景:
-
短距离通信(<3米)
-
通信速率不高(<115200bps)
-
接收方处理能力足够
-
使用数据缓冲机制
b) 需要启用流控的情况
-
高速通信(>115200bps)
-
长距离传输(易受干扰)
-
处理能力差异大的设备间通信
-
无硬件缓冲区的简单系统
STC51的串行通信相关寄存器详解
STC51串口通信的硬件结构
(1) 串行数据缓冲器(SBUF):物理上是两个独立的寄存器(发送SBUF和接收SBUF),但共用同一个地址(99H)
(2) 串行控制寄存器(SCON):控制串口工作方式和状态
(3) 电源控制寄存器(PCON):其中的SMOD位用于波特率加倍控制
(4) 波特率发生器:使用定时器T1或T2作为波特率发生器




在STC51中90%的情况只用工作方式一(SM0-0;SM1-1)
串口发送时的软硬件协作的两种方式
(1)查询方式。硬盘在发送完一帧数据后会将一个标志位置位(标志位本来是0),软件需要不断读取这个标志位的值来判断硬件是否完成了发送(如果读出来是0就表示硬件还在发还没完还在忙,所以我们就不能认为硬件发完了,所以就不能给硬件安排下一帧数据的发送;如果读出来的是1则说明硬件已经发完了上一帧数据,这时候软件就应该给硬件再给一帧数据去发送)。 因为串口发送完这个事件对CPU来说是个异步事件,所以这里查询方式来处理和之前讲过的查询方式处理按键是非常类似的。
(2)中断方式。查询方式处理的劣势是CPU必须一直守着串口发送,在串口发送完所有字节之前CPU不能离开去做别的事情,这对CPU来说是极大的浪费(因为CPU的速度比串口发送的速度快多了)。因此用中断方式来处理串口发送是非常合适的,可以提升CPU使用率。
(3)常见情况下:串口发送会使用查询方式,而串口接收会使用中断方式。


STC51的串行通信实战
1、硬件接线分析
(1)目标:将PC机与51单片机通过串口连接起来
(2)PC机的串口情况:台式机串口、笔记本USB转串口
(3)开发板原理图分析
1.单片机部分,P3.0/RXD和P3.1/TXD这两个为复用接口,通信时将此引脚调为RXD和TXD模式

2、接线方案
所以提供了最简单的一种接线方式:
1.使用TTL接口USB转串口线:只接三根线:TxD、RxD、GND(要求PC端的USB转串口的信号必须转出来的是TTL信号才可直接连接到单片机CPU1部分)

PC端的RXD---->CPU1端的TXD(P3.1);
PC端的TXD---->CPU1端的RXD(P3.0);
PC端的GND---->CPU1端的GND
2.使用DB9接口USB转串口线:用DB9接口的USB转串口线、注意跳线冒接到DB9一侧

MAX232芯片的作用是:在RS232电平(九孔的,电平12V)和TTL电平(类似于杜邦线单孔。电平3.3V或者是5V)之间做转换。
3.使用板载CH340:什么都不用动,默认就用这个,最简单最省事,最推荐

STC51的串行通信实战
使用板载CH340进行串口实践
1、串口的监视
普中A7
(1)接线+下载程序
使用USB:接线帽要接到TXDU和RXDU

使用RS232:接线帽TXDR和RXDR
(2)查设备管理器确定COM号

(3)使用软件对串口进行监视
3.1、使用普中下载软件自带的串口助手监视
3.2、使用SecureCRT软件监视(推荐用)
2、串口发送(单片机向PC端发送数据)
(1)串口的初始化

(2)波特率的计算
工作方式为方式1:SMOD为1,下载速度选择为12T,SYSclk(晶振为12兆【12000000】),求出我们要算出来的TH1。
![]()


代入公式:设置4800波特率,则TH1 = 243;
串行通信模式1和3,其波特率是可变的:

设置定时器/计数器1的工作方式




(3)发送1个字节
串口发送会使用查询方式
检查串口发送部分没有在忙:TI为0,硬件在忙


总程序测试




成功运行

以上串口发送函数为发送字符,也可以发送字符串,如下:


3、串口接收(PC端发送数据给单片机,单片机进行接收)
串口接收会使用中断方式
给单片机发送一个字节时就会触发中断,需要程序去捕获这个中断。中断处理程序需要看你的中断编号是什么,查找数据手册发现UART对应的就是interrupt 4

所以中断处理程序编写逻辑:当单片机收到数据后就进入中断,然后进行中断接收(读取SBUF)

RS485介绍
UART的缺点:传输距离受限
(1)理论上RS232不超过15米
(2)理论上TTL电平通信距离更短(maybe 1米)
(3)实际上几百米也有人宣称做到了,但是稳定性不能保证
(4)波特率越高通信距离越近
远距离传输怎么办?
(1)提高电压标准
(2)提高通信线抗干扰能力、降低阻抗
(3)使用差分信号
RS485(RS422)
(1)最大通信距离1200多米,最快通信速率10Mbps,距离和速度成反比
(2)差分信号负逻辑
(3)更远距离可以加中继器
(4)半双工
(5)RS485只提供物理层通信能力,不提供数据层协议,需要用户自定义,或者使用标准协议如MODBUS协议。
MAX485介绍
(1)CPU本身只会提供UART接口,而不会提供RS485接口。CPU根本不认识RS485.
(2)RS485使用时场景是:CPUA->UART转RS485------远距离通信-----RS485转UART->CPUB
(3)大家对RS485的理解,应该是这样的:RS485是纯硬件实现的,硬件芯片如MAX485来管理的,根本不涉及软件编程。软件工程师只关注串口,只通过串口将数据发送出去或者接收回来即可。UART转485和485转UART对CPU来说是透明的。


1万+

被折叠的 条评论
为什么被折叠?



