串口UART作為嵌入式應(yīng)用和通訊領(lǐng)域中最常用的接口之一,接口協(xié)議雖然簡單,但在實際應(yīng)用中不同設(shè)備之間的通訊也會存在各種小問題,下面對使用中各種常見的問題做下總結(jié)和梳理,可作為調(diào)試參考。串口可分為異步串口(UART)和同步串口(USART),后者多出時鐘信號線用作通訊時信號同步。本篇僅介紹異步串口。
一、串口通信常見問題
串口通信亂碼
串口通訊亂碼通常是指接收方接收到的數(shù)據(jù)不符合預期,出現(xiàn)此情況時需要考慮的因素通常包含以下幾個方面:
1、雙方設(shè)定的串口參數(shù)是否匹配,需檢查設(shè)置的:串口波特率、串口數(shù)據(jù)格式等參數(shù)。
2、串口通訊電壓不匹配,不同的串口設(shè)備接收可正常進行解碼的高低電平門限不同,如同樣是3.3V串口通訊,A設(shè)備低電平門限1.5V,B設(shè)備低電平門限1V。當實際串口電壓低電平只有1.5V時,B設(shè)備無法正常接收數(shù)據(jù)。又如:A設(shè)備為5V串口,B設(shè)備為3.3V串口,同樣有電壓不匹配的問題。
3、串口通訊實際工作波特率誤差較大,即:串口工作實際波特率和理論值偏差較大,因一些MCU和串口設(shè)備所用時鐘為了兼顧其他資源和應(yīng)用需要,實際工作的串口速率和設(shè)定會有偏差。比如:標稱為9600bps時,實際工作在了10000bps(誤差超過4%),此時可能已經(jīng)超出接收方的設(shè)計標準。
4、串口通訊信號質(zhì)量差,如通訊時信號上升下降抖動嚴重,信號有過沖或者變化比較遲緩,此時檢查硬件上共地是否良好,以及線路上有無串接/并聯(lián)其他器件導致。
5、數(shù)據(jù)格式顯示問題,通常使用十六進制或ASCII碼格式居多,使用時需要區(qū)分。
串口無法發(fā)送
串口無法發(fā)送通常是指與此串口的TXD連接的對端設(shè)備RXD通道接收不到任何數(shù)據(jù),總結(jié)如下:
1、使用儀器對TXD通道進行實際測量,觀察硬件波形,確定信號是否有輸出以及是否正常。(串口電壓、串口信號上升下降時間)
2、短接設(shè)備的TXD和RXD通道回環(huán)測試,看自收發(fā)是否可以成功。排除是自身設(shè)備異常還是對端異常。
3、確定應(yīng)用軟件是否打開串口硬件流控,如當啟用RTS/CTS硬件流控后但實際該引腳并沒有連接或連接但不生效時,按照協(xié)議規(guī)定,CTS輸入無效則發(fā)送方暫停發(fā)送數(shù)據(jù)。
4、MCU軟件編碼問題或計算機端軟件工作異常。
串口無法接收
當串口接收不到任何數(shù)據(jù)的原因通常如下:
1、對端串口實際未能成功發(fā)送數(shù)據(jù)。
2、串口發(fā)送有效電壓不滿足芯片接收解碼要求。
3、MCU軟件編碼問題或計算機端軟件工作異常。
二、常用的排查小技巧
對于以上的常見串口調(diào)試問題,有以下幾個方法和技巧可供參考使用。
使用硬件儀器
善于使用示波器等硬件采集或分析工具查找問題,用此方法可以確定線路上信號的串口電壓、串口數(shù)據(jù)格式、串口通信波特率等參數(shù)。
串口Loopback檢測
當手頭沒有硬件儀器時,將設(shè)備自身的TXD和RXD短接起來進行自收發(fā)測試也是一個不錯的選擇,此方式可以簡單確認硬件通路和整個邏輯是否是打通的。但缺點是定位問題不夠精準。
更換串口調(diào)試軟件
計算機端串口軟件種類較多,不排除一些設(shè)備或驅(qū)動軟件沒法成功適配所有的串口調(diào)試軟件,此時可嘗試多使用幾款不同的軟件對比測試。
三、串口通信基礎(chǔ)
當兩個設(shè)備使用UART進行通信時,它們至少通過三根導線連接:TXD串口發(fā)送、RXD串口接收、GND。串口設(shè)備通過改變TXD信號線上的電壓來發(fā)送數(shù)據(jù),接收端通過檢測RXD線上的電壓來讀取數(shù)據(jù)。
什么是串口通信
計算機一次傳輸信息(數(shù)據(jù))一位或多個比特位。串行是指傳輸數(shù)據(jù)一次只傳輸一位。當進行串口通信時發(fā)送或者接收的每個字(即字節(jié)或字符)一次發(fā)送一位。每一位都是邏輯‘1’或者‘0’。也用Mark表示邏輯1,Space表示邏輯0。
串口數(shù)據(jù)速率使用 bits-per-second ("bps") 或者 baud rate ("baud")。這表示一秒內(nèi)可以傳輸多少邏輯1和0。當波特率超過 1000,你會經(jīng)??吹接肒bps表示的速率。對于超過 1000000 的速率一般用Mbps 來表示。
TTL串口
實際應(yīng)用中,使用TTL電平逐漸成為趨勢,在MCU與串口轉(zhuǎn)接芯片提供的串口中比較常見,此時邏輯1電壓值:+5V或+3.3V等,邏輯0電壓值:0V(邏輯地)。
RS-232串口
RS-232 是由 EIA 定義的用于串口通信的標準電氣接口。RS-232 實際上有三種不同的類型(A,B和C),每一種對于邏輯1和邏輯0,電平定義了不同的電壓范圍。最常用的種類是 RS-232C,它定義邏輯1電壓范圍:-3V~-12V 和邏輯0電壓范圍:+3V~+12V。
下面列舉最為常見的 DB-9 接口分布圖,引腳和功能描述如下所示:
其他還有RS-422以及 RS-485 串口標準。RS-422 使用更低電壓與差分信號允許線纜長達 1000英尺(300m)。
常用串口信號定義
GND - 邏輯地
從技術(shù)上講,邏輯接地不是信號,但沒有它,其他信號就不能工作。從根本上說,邏輯地充當一個參考電壓,從而知道哪些電壓為正或負。
TXD - 發(fā)送數(shù)據(jù)
RXD - 接收數(shù)據(jù)
RTS - 請求發(fā)送
RTS設(shè)置為邏輯0電平表示己方準備好接收數(shù)據(jù)。一般與CTS一起用于串口流控,通常被設(shè)置為默認有效狀態(tài)。
除流控功能外,RTS也可用作通用輸出信號,輸出高低電平。常用于單片機復位或串口下載電路。
CTS - 清除發(fā)送
CTS信號接收自串口線纜的另一端。信號線邏輯0電平表示己方可以發(fā)送數(shù)據(jù)。一般與RTS一起用于串口數(shù)據(jù)流控。
DTR - 數(shù)據(jù)終端就緒
DTR 信號用于通知對端計算機或設(shè)備己方已就緒(邏輯0電平)或未就緒(邏輯1電平)。DTR也可用作通用輸出信號,輸出高低電平。常用于單片機復位或串口下載電路。
串口波特率
波特率是指串口每秒鐘傳輸?shù)腷it總數(shù),如:9600波特率。表示1s傳輸9600個比特。1個比特所需時間為:1/9600 ≈ 0.104ms
串口異步通信
解析串口數(shù)據(jù)需要確定一個字符的結(jié)束與下一個字符的開始。
串口數(shù)據(jù)線空閑時保持在邏輯1狀態(tài)直到有字符發(fā)送。每個字節(jié)起始位在前,字節(jié)的每一位緊隨其后,一位可選校驗位以及一位或者兩位停止位。起始位始終是邏輯0,通知對方有新串口數(shù)據(jù)可用。數(shù)據(jù)可以同時發(fā)送和接收,因此稱為“異步”。
偶校驗:數(shù)據(jù)位加上校驗位中的“1”的個數(shù)保持為偶數(shù)。
奇校驗:數(shù)據(jù)位加上校驗位中的“1”的個數(shù)保持為奇數(shù)。
空白校驗:也稱Space校驗,校驗位永遠是0。
標志校驗:也稱Mark校驗,校驗位永遠是1。
無校驗:沒有校驗位存在或被傳輸。
剩下的位稱作停止位。在字符之間可能會有 1,1.5 或者 2 位停止位并且這些位總為 1。異步數(shù)據(jù)格式通常表達成“8N1”,“7E1”等。
什么是全雙工和半雙工
全雙工是指設(shè)備可以同時發(fā)送和接收數(shù)據(jù),有兩個獨立數(shù)據(jù)通道(一路輸入,一路輸出)。
半雙工是指設(shè)備不能同時發(fā)送和接收數(shù)據(jù),這通常意味著只有一路可以通訊,如RS485串口。
串口流控
在兩個串口設(shè)備間傳輸數(shù)據(jù)時經(jīng)常有必要進行數(shù)據(jù)流控。這可能是受到中間串口通信線路、其中一個設(shè)備或者其他存儲介質(zhì)的限制。異步數(shù)據(jù)流控通常使用的有兩種方法。
第一種方法通常稱為“軟件”流控,使用特殊字符開始(XON or DC1)或者停止(XOFF or DC3)數(shù)據(jù)流。這些字符定義參見 ASCII 碼表。這些碼值在傳輸文本信息時很有用,但不能在未經(jīng)特殊編程時用于傳輸其他類型的信息。
第二種方法稱作“硬件”流控,使用RTS和CTS信號線取代特殊字符。當接收方準備好接收數(shù)據(jù)時會將RTS置為邏輯0以請求對方發(fā)送數(shù)據(jù),當未準備好時置為邏輯1,因此發(fā)送方會通過檢測 CTS 電平狀態(tài)判斷是否可以發(fā)送數(shù)據(jù)。
使用硬件流控至少需要連接的信號線有GND、RXD、TXD、RTS、CTS。
使用軟件流控只需要GND、RXD、TXD。
Break信號
通常情況下收發(fā)數(shù)據(jù)信號線保持在邏輯1狀態(tài)直到傳輸一個新字節(jié)。如果信號拉低至邏輯0一段時間(各平臺定義不同,通常是 1/4 到 1/2 秒)那么就說一個 break 條件滿足。一個break信號有時用于復位通訊或者改變通訊硬件的操作模式,如MODEM。
———————————————————————————————————————————
以上為串口使用經(jīng)常遇到的問題和調(diào)試技巧,歡迎工程師討論補充~