1. 初识UART:串行通信的“老伙计”
大家好,我是老张,在嵌入式这行摸爬滚打十几年了,从51单片机到现在的各种ARM核,UART这个通信协议几乎是我每天都要打交道的“老伙计”。很多刚入门的朋友一听到“通信协议”就觉得头大,感觉特别复杂。其实啊,UART可以说是所有通信协议里最“平易近人”的一个了。你可以把它想象成两个人用对讲机聊天,一次只能说一个字(一位数据),说之前要先喊一声“喂”(起始位),说完之后要说“完毕”(停止位),就这么简单。
UART的全称是“通用异步收发传输器”,听起来很唬人,但它的核心工作就两个:“串行” 和 “异步”。我来给你拆解一下。“串行”意味着数据像糖葫芦一样,一个比特(bit)接一个比特地排着队,在一根线上传输。这和我们电脑里CPU和内存之间那种“并行”通信(多根线同时传多位数据)正好相反。为啥要用串行?省线啊!尤其是在设备之间需要长距离连接,或者芯片引脚资源紧张的时候,只用两根数据线(TX和RX)就能通信,成本优势巨大。
那“异步”又是什么意思呢?这是UART最精妙也最容易让人困惑的地方。它指的是通信的双方——发送方和接收方——没有共享同一个时钟信号。想象一下,两个人约好每天下午3点通电话,这就是“同步”,大家看同一个钟。而UART更像是发短信,我随时可以发给你,你看到就回,我们俩的手机时钟哪怕差个几秒也没关系。在UART通信里,双方需要提前约定好一个速度,也就是波特率。只要双方的波特率设置得一样,接收方就能根据这个约定的速度,在正确的时间点去“采样”数据线上的电平,从而解读出正确的0和1。这个“约定”就是通信成功的基础,如果两边波特率对不上,那收到的就是一堆乱码,我调试时没少因为这事儿抓耳挠腮。
在实际项目中,UART的身影无处不在。比如,你的单片机要通过Wi-Fi模块联网,通常就是用UART发送AT指令;调试程序时,通过串口打印printf信息到电脑的串口助手;还有像GPS模块、蓝牙模块、很多传感器,它们的标配接口往往就是UART。它就像电子世界里的“普通话”,虽然速度不是最快的,但普及率最高,用起来最省心。
2. 深入帧结构:一帧数据是如何“打包”的
我们知道了UART是异步串行通信,那具体每一个字节的数据是怎么被包装起来,在线路上传输的呢?这就引出了UART的帧结构。一帧数据,就是一个完整的、可被独立解析的数据包,通常包含一个字节的有效信息。这个“打包”过程非常讲究,它确保了数据在嘈杂的电气环境中也能被准确识别。下面这张图清晰地展示了一帧数据的完整构成,我们可以结合它来详细拆解每一个部分:
flowchart LR
subgraph A [一帧UART数据]
direction LR
S[起始位<br>逻辑0] --> B0[数据位 D0<br>LSB] --> B1[数据位 D1] --> B2[数据位 D2] --> B3[数据位 D3]
B3 --> B4[数据位 D4] --> B5[数据位 D5] --> B6[数据位 D6] --> B7[数据位 D7<br>MSB]
B7 --> P[奇偶校验位<br>可选] --> SP[停止位<br>逻辑1] --> I[空闲位<br>逻辑1]
end
2.1 起始位:一声清脆的“发令枪”
一切的开始,都源于那一声“枪响”。在UART通信中,数据线在空闲状态时,会一直保持在高电平(逻辑1)。当发送端准备发送一个字节的数据时,它做的第一件事,就是把数据线从高电平拉低到低电平(逻辑0),并保持一个比特的时间。这个低电平脉冲,就是起始位。</


4万+

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



