
為什么需要“流控”?
先舉個日常場景:小區(qū)快遞員(發(fā)送方)送快遞,你(接收方)在家收快遞。如果你正在忙(比如做飯),沒法及時開門收件,快遞員硬要把快遞塞進(jìn)去,很可能導(dǎo)致快遞丟失;但如果居你能提前告訴快遞員“現(xiàn)在能收”或“等下再來”,就能避免這種問題。
UART通信里的“流控”,主要就是解決這個問題:發(fā)送方和接收方的處理速度可能不匹配(比如發(fā)送方是高速 SoC,接收方是低速傳感器),如果發(fā)送方一股勁拼命發(fā)數(shù)據(jù),接收方緩沖區(qū)滿了處理不過來,多余的數(shù)據(jù)就會丟失。流控的作用,就是讓收發(fā)雙方“互相溝通”,協(xié)調(diào)傳輸節(jié)奏。
流控分兩種:軟件流控(靠特殊字符XON/XOFF)和硬件流控(靠專用引腳RTS/CTS)。今天重點聊更可靠、更常用的——RTS/CTS硬件流控。
RTS和CTS 是兩個“通信信號兵”
UART基礎(chǔ)通信只需要TX(發(fā)送線)、RX(接收線)、GND(地線)三根線,而RTS/CTS硬件流控需要額外增加兩根專用引腳,這兩根線就像兩個“信號兵”,專門負(fù)責(zé)傳遞“能不能發(fā)數(shù)據(jù)”的指令。

RTS(Request To Send)——請求發(fā)送:由“接收方”控制,發(fā)給“發(fā)送方”的信號,意思是“我(接收方)準(zhǔn)備好了,你可以發(fā)數(shù)據(jù)了”(或“我忙,別發(fā)了”); 注意:很多人會搞反控制方,記住“RTS是接收方發(fā)的請求”,不是發(fā)送方!
CTS(Clear To Send)——允許發(fā)送:由“發(fā)送方”控制,發(fā)給“接收方”的信號?不!錯了!再記一遍:CTS是“對RTS的響應(yīng)”,通常和RTS交叉連接——接收方通過RTS發(fā)請求,發(fā)送方看到后,通過CTS回應(yīng)“我收到你的請求了,馬上發(fā)/停止發(fā)”;更簡單的記法:RTS=接收方的“就緒信號”,CTS=發(fā)送方的“應(yīng)答信號”,兩根線交叉連接(A的RTS接B的CTS,A的CTS接B的RTS)。
補充:硬件上,RTS和CTS都是“低電平有效”(大部分場景)——比如接收方拉低RTS,就表示“我就緒了”;發(fā)送方拉低CTS,就表示“我收到指令,準(zhǔn)備發(fā)/已停止”。
總結(jié)
RTS/CTS硬件流控的一句話概括:接收方靠RTS發(fā)“就緒/暫?!毙盘枺l(fā)送方靠CTS響應(yīng),從硬件層面協(xié)調(diào)傳輸節(jié)奏,避免數(shù)據(jù)丟失。它不需要占用數(shù)據(jù)帶寬,可靠性高,是高速、大數(shù)據(jù)量UART通信的“必備技能”。
你在使用UART流控時,有沒有遇到過接線接反、配置無效這類坑?歡迎評論區(qū)留言交流分享~
(完)
本人專注 Linux 驅(qū)動 & Linux/Android BSP 開發(fā)調(diào)試,可接外包項目/技術(shù)支持/問題定位。有需求或交個朋友可加微信:【Chen_WeChat2026】。
-
嵌入式
+關(guān)注
關(guān)注
5210文章
20679瀏覽量
337345 -
uart
+關(guān)注
關(guān)注
22文章
1322瀏覽量
107026
發(fā)布評論請先 登錄
2025嵌入式開發(fā)教程|遠(yuǎn)航哥
什么是嵌入式應(yīng)用開發(fā)?
Renesas Starter Kit for RX72T:開啟嵌入式開發(fā)新征程
探索 RENESAS EK - RX261 v1 評估套件:開啟嵌入式系統(tǒng)設(shè)計新旅程
系統(tǒng)嵌入式的學(xué)習(xí)路線
什么是嵌入式操作系統(tǒng)?
嵌入式主板的選型與應(yīng)用
嵌入式需要掌握哪些核心技能?
入行嵌入式應(yīng)該怎么準(zhǔn)備?
CYW20704 的 UART 4 針(TX/RX/CTS/RTS)是什么形式(推拉或漏極開路)嗎?
Tx-Rx iPAC FEM 雙頻 GSM/GPRS skyworksinc
用于雙頻 GSM / GPRS / EDGE 的 Tx-Rx 前端模塊 skyworksinc
Tx–Rx iPAC? 前端模塊 – 四頻 GSM/GPRS skyworksinc
用于雙頻 GSM / GPRS 的 Tx-Rx iPAC? 前端模塊 skyworksinc
嵌入式分享#60:UART 我只會 TX、RX
評論