試排障)
做嵌入式、單片機(jī)或者工控的人基本都會遇到RS232。但很多人在第一次接設(shè)備時會被“RS232電平”這個詞卡住以為串口就是RS232RS232就是TTL直接拿杜邦線把單片機(jī)引腳和工控機(jī)串口接在一起結(jié)果要么收不到數(shù)據(jù)要么把引腳燒掉。這篇文章先把RS232電平到底是什么講清楚再往后把引腳定義、電平轉(zhuǎn)換、USB轉(zhuǎn)串口、通信調(diào)試和排障經(jīng)驗一次說透。適合剛接觸串口通信的單片機(jī)開發(fā)者、電氣工程師和自動化調(diào)試人員閱讀尤其是正在做設(shè)備聯(lián)調(diào)、傳感器接入或者老設(shè)備通信改造的人看完可以直接對著實物去測。很多人把RS232當(dāng)成一種接口形狀其實它不是。RS232是一種邏輯電平標(biāo)準(zhǔn)規(guī)定了用多大的電壓表示數(shù)字0和1同時規(guī)定了信號線定義、傳輸距離和速率范圍。真正天天跟RS232打交道的人手上通常有示波器、串口調(diào)試助手以及一堆DB9公母頭轉(zhuǎn)接線。下面我都會按實際使用場景來拆。1. 先分清三組概念串口、UART、RS2321.1 串口到底是什么串口是一種按位傳輸數(shù)據(jù)的通信方式英文叫Serial Port全稱是串行接口。它和并行接口相對并行接口一次傳多位串口一次只傳一位但因為只需少數(shù)幾根信號線所以布線簡單、成本低、傳輸距離可以做得更遠(yuǎn)。日常工作中人們說“串口”時含義常常是混著的。有時候是指DB9那個物理接口有時候是指電腦上的COM口有時候又是指單片機(jī)上的UART引腳。這種混稱本身問題不大但做技術(shù)判斷時必須分層看待。可以把串口分成三層物理層比如DB9接頭、線纜、屏蔽層電平標(biāo)準(zhǔn)比如RS232、TTL、RS485、RS422協(xié)議層比如幀格式、波特率、停止位、校驗位。RS232屬于第2層但它往往同時決定了第1層的物理形態(tài)所以很多人直接把它當(dāng)成串口的代名詞。1.2 UART是控制器內(nèi)部的外設(shè)RS232是外部電平標(biāo)準(zhǔn)單片機(jī)里最常用的串行通信外設(shè)叫UART全稱是Universal Asynchronous Receiver/Transmitter通用異步收發(fā)器。UART負(fù)責(zé)把并行數(shù)據(jù)轉(zhuǎn)成串行數(shù)據(jù)發(fā)送或者把接收到的串行數(shù)據(jù)轉(zhuǎn)成并行數(shù)據(jù)交給CPU。UART本身只處理邏輯電平不關(guān)心你用的是3.3V還是5V也不關(guān)心引腳出來之后要經(jīng)過什么轉(zhuǎn)換電路。它輸出的信號在單片機(jī)引腳上通常是TTL電平也就是0V附近表示邏輯0供電電壓附近表示邏輯1。RS232則是另一套電平標(biāo)準(zhǔn)。它把邏輯1定義成負(fù)電壓把邏輯0定義成正電壓。常見的說法是邏輯1空號MARK-3V到-15V邏輯0傳號SPACE3V到15V-3V到3V之間是電平跳變區(qū)不表示有效數(shù)據(jù)。實際電路中RS232電平轉(zhuǎn)換芯片常見的輸出擺幅多在±5V到±10V之間并不是教科書里剛好±12V。這里就出現(xiàn)第一個坑單片機(jī)UART引腳直接輸出的TTL電平信號電氣特性和RS232不兼容如果直接插到電腦的COM口或老式工控機(jī)的RS232端口上輕則收不到數(shù)據(jù)重則損壞IO口甚至主板串口控制芯片。反過來RS232電平也不能直接接到單片機(jī)的TTL引腳上。1.3 為什么RS232要用負(fù)邏輯初學(xué)者最容易問的就是這個問題為什么RS232不干脆用高電平表示1、低電平表示0非要反著來RS232標(biāo)準(zhǔn)制定于上世紀(jì)60年代末最初用于遠(yuǎn)程終端和調(diào)制解調(diào)器之間的通信。當(dāng)時線纜長、環(huán)境干擾大、設(shè)備地電位也可能不一致。采用雙極性電壓表示數(shù)據(jù)也就是正負(fù)交替的電壓擺幅比單端0V到正電壓的抗干擾能力更強(qiáng)也更容易用變壓器耦合實現(xiàn)電氣隔離。接收端通過判斷電壓極性來識別數(shù)據(jù)而不是單純判斷閾值這樣在較長距離傳輸時容錯性更好。另一個好處是電平范圍寬對發(fā)送端和接收端的實現(xiàn)要求都低。即使線路有壓降、設(shè)備之間有地電位差只要信號落在±3V到±15V范圍內(nèi)接收端就能正確識別。現(xiàn)代設(shè)計里很多設(shè)備已經(jīng)改成USB或者485通信但在老式PLC、儀表、機(jī)床控制器、醫(yī)療設(shè)備、工業(yè)電腦上RS232接口仍然大量存在。理解它為什么采用負(fù)邏輯有利于排查地環(huán)路和線纜壓降問題。2. RS232的電氣參數(shù)和關(guān)鍵指標(biāo)2.1 發(fā)送端與接收端的電壓范圍不一樣RS232標(biāo)準(zhǔn)對發(fā)送端和接收端的要求是分開定義的實際調(diào)試時要留意。發(fā)送端要能輸出邏輯1-5V到-15V邏輯05V到15V。接收端能識別為邏輯1的范圍是邏輯1-3V到-15V邏輯03V到15V。可以看出接收端的判別閾值比發(fā)送端寬。也就是說發(fā)送端只要保證輸出幅度足夠接收端哪怕信號衰減到±3V左右仍然能正確識別。很多人在用示波器測RS232信號時只看有沒有負(fù)壓不看幅度。實際上正常運行時的信號空閑狀態(tài)下應(yīng)該穩(wěn)定在負(fù)電壓附近也就是-3V以下多數(shù)芯片輸出是-5V到-12V。如果你測到的空閑電平在0V附近晃那多半不是真正的RS232信號或者轉(zhuǎn)換芯片已經(jīng)出了問題。2.2 電平擺幅與傳輸距離、速率的關(guān)系RS232標(biāo)準(zhǔn)規(guī)定的最大通信距離常見資料說是15米左右。但這個數(shù)值建立在“導(dǎo)線電容、波特率、電壓擺幅”都比較理想的前提下。實際工程中如果線纜質(zhì)量差、走線靠近動力線、兩端地電位差異大距離會被明顯縮短。我自己在調(diào)試中遇到過10米以內(nèi)都穩(wěn)換了另一批屏蔽線之后亂碼率升高的案例問題就出在線纜芯線截面積和屏蔽層接地方式上。速率方面RS232標(biāo)準(zhǔn)規(guī)范的最初速率并不高工程中常見的9600、115200波特率完全在能力范圍內(nèi)。更高的波特率不是不可能但距離和線纜要求會更苛刻。同一個RS232鏈路里發(fā)送端、接收端、波特率、數(shù)據(jù)格式必須匹配。其中波特率誤差最好不要超過2%到3%晶振老化的板子很容易出現(xiàn)高波特率下偶發(fā)亂碼。遇到高波特率不穩(wěn)定先看兩端時鐘精度再看線纜最后才考慮芯片。2.3 單端傳輸?shù)亩贪錜S232屬于單端傳輸信號參考的是信號地。發(fā)送端驅(qū)動一根信號線接收端測量信號線和地線之間的電壓。單端傳輸?shù)膬?yōu)點是簡單缺點是抗共模干擾能力弱。如果發(fā)送端和接收端之間距離較長兩臺設(shè)備的地電位不完全一致就會出現(xiàn)地環(huán)路電流導(dǎo)致接收數(shù)據(jù)亂碼、偶發(fā)丟字節(jié)、甚至接口芯片損壞。排查RS232通信問題時地線連接經(jīng)常被忽略。很多人只檢查TX、RX兩根線卻忽略了三線制中的GND。RS232設(shè)備通信至少需要連接三根線TXD、RXD、GND。部分只需要單向傳輸?shù)膱鼍耙部赡鼙仨毥覩ND否則接收端沒有電參考點無法判定信號極性。3. RS232引腳定義與常見接口形態(tài)3.1 DB9接口引腳怎么區(qū)分最常見的RS232物理接口是DB9也有的設(shè)備用DB25但DB25已經(jīng)很少見。DB9雖然是9根引腳但完整RS232標(biāo)準(zhǔn)定義的信號不止9根實際常用的是其中幾根。一定要分清楚公頭和母頭否則做線時會反。公頭DB9 Male針在殼體內(nèi)通常叫“針頭”引腳向外凸出母頭DB9 Female孔在殼體內(nèi)通常叫“孔頭”有孔洞。DB9公頭和母頭的引腳序號定義不一樣。標(biāo)準(zhǔn)接法中最常用的是2、3、5三根腳分別對應(yīng)引腳RS232信號名方向功能1DCD輸入到DTE載波檢測2RXD輸入到DTE接收數(shù)據(jù)3TXD輸出自DTE發(fā)送數(shù)據(jù)4DTR輸出自DTE數(shù)據(jù)終端就緒5GND公共信號地6DSR輸入到DTE數(shù)據(jù)設(shè)備就緒7RTS輸出自DTE請求發(fā)送8CTS輸入到DTE清除發(fā)送9RI輸入到DTE振鈴指示其中DTE指的是數(shù)據(jù)終端設(shè)備常見的是電腦DCE指的是數(shù)據(jù)通信設(shè)備常見的是Modem或者某些串口設(shè)備。但實際設(shè)備不一定會完全按照這個方向標(biāo)注很多工控設(shè)備的DB9引腳定義和“電腦標(biāo)準(zhǔn)”并不一致。3.2 兩個RS232設(shè)備連接時收發(fā)為什么要交叉做過電腦串口與單片機(jī)開發(fā)板連接的人都知道把單片機(jī)的TXD接到電腦串口的RXD單片機(jī)的RXD接到電腦串口的TXD。因為兩邊的TXD都是發(fā)送腳直連的話就是兩個發(fā)送腳對著發(fā)送腳無法通信。標(biāo)準(zhǔn)的DTE到DCE連接可以直通因為DCE的RXD和DTE的TXD本來就是對應(yīng)關(guān)系。但電腦和電腦、電腦和工控板這類DTE之間的連接必須把TX和RX交叉也就是做一根“交叉串口線”。有經(jīng)驗的操作員拿到一臺不知道定義的老設(shè)備時不會直接默認(rèn)標(biāo)準(zhǔn)定義而是先用萬用表的通斷檔或者電壓檔判斷各腳電平再用示波器抓空閑電平。RS232在空閑狀態(tài)應(yīng)該處于負(fù)電壓這個特性可以在不上電的情況下初步判斷設(shè)備是否在發(fā)送也可以用來確認(rèn)TXD引腳位置。3.3 三線制通信是最常用的最小連接很多RS232應(yīng)用只需要單向或雙向數(shù)據(jù)收發(fā)不需要硬件流控這時只接三根線就夠了TXD連接對方RXDRXD連接對方TXDGND連接對方GND。RTS、CTS、DTR、DSR等信號屬于硬件流控或狀態(tài)握手線。在簡單的數(shù)據(jù)采集、傳感器上傳、控制器調(diào)試場景中可以不用。但如果對方設(shè)備設(shè)置了“必須檢測CTS才允許發(fā)送”的流控模式不接RTS/CTS就會導(dǎo)致數(shù)據(jù)發(fā)不出去。所以調(diào)試時要分兩步看先確認(rèn)對方是不是開啟了硬件流控再決定是否連接流控引腳。很多“通信無響應(yīng)”的問題其實就是流控未設(shè)置導(dǎo)致的不是接線錯誤。4. RS232電平和TTL電平怎么轉(zhuǎn)換4.1 為什么要轉(zhuǎn)換單片機(jī)引腳、傳感器模塊、樹莓派GPIO等設(shè)備絕大多數(shù)對外輸出的是TTL電平或者低壓CMOS電平。典型的TTL電平標(biāo)準(zhǔn)下邏輯00V到0.8V邏輯12V到5V。對3.3V單片機(jī)來說高電平輸出約3.3V低電平約0V。RS232的標(biāo)準(zhǔn)卻是高電平為負(fù)、低電平為正。兩者的定義完全不同所以必須通過電平轉(zhuǎn)換電路把RS232電壓擺幅轉(zhuǎn)換成TTL可接受的0到3.3V或0到5V信號或者反向轉(zhuǎn)換。常見的轉(zhuǎn)換方案有專用芯片方案、分立元件方案和USB轉(zhuǎn)串口方案。4.2 MAX232系列是經(jīng)典方案老工程師基本都用過MAX232它內(nèi)部集成電荷泵電路用少量外部電容就能從單一5V電源生成RS232所需的正負(fù)電壓。典型接法需要4個或5個電容比如1uF、0.1uF都有具體要看芯片型號和數(shù)據(jù)手冊。MAX232輸出擺幅在±5.5V到±10V之間足夠滿足RS232接收端±3V的閾值要求。很多開發(fā)板上的RS232接口就是用MAX232或者兼容芯片做的。如果系統(tǒng)是3.3V供電需要使用MAX3232或者兼容型號。MAX3232可以用3V到5.5V電源工作輸出擺幅依然能滿足RS232電平要求。設(shè)計時必須確認(rèn)芯片是5V版還是3.3V版不能直接用老款MAX232接3.3V系統(tǒng)否則芯片不能保證正常工作。實際設(shè)計時注意電荷泵電容的位置和容值不能隨意改。有些板子為了省空間把電容縮小會造成輸出擺幅偏低、帶載能力下降尤其在線纜較長或接收端輸入阻抗較低時可能時好時壞。4.3 分立三極管或MOS管方案有些低成本項目不會用MAX3232而會用三極管或者M(jìn)OS管搭建反向電平轉(zhuǎn)換電路。常見原理是單端RS232信號進(jìn)來后通過三極管反相并縮放到TTL電平TTL信號出去時通過三極管或MOS管把邏輯電平拉高到RS232負(fù)壓或者正壓。這種方案的缺點是電路參數(shù)跟電源電壓、信號波特率、負(fù)載電容強(qiáng)相關(guān)調(diào)試時比專用芯片麻煩。舉例來說如果使用5V供電的TTL端而對方發(fā)來的RS232信號空閑電平是-8V那么接收側(cè)需要確認(rèn)分壓電阻能把-8V映射到可接受的0到5V區(qū)間同時不能在三極管基極加出超出耐壓的電壓。對于學(xué)習(xí)演示來說分立元件電路能很直觀地幫助理解電平轉(zhuǎn)換原理。但做產(chǎn)品或者做工業(yè)設(shè)備改造時我更建議用專用芯片或者成熟的串口模塊節(jié)省排查時間。4.4 USB轉(zhuǎn)串口方案解決電腦沒有COM口的問題現(xiàn)在的筆記本和大部分臺式機(jī)已經(jīng)沒有DB9串口所以調(diào)試RS232設(shè)備最常用的工具是USB轉(zhuǎn)RS232線或者USB轉(zhuǎn)TTL小板。這里有個非常重要的區(qū)分USB轉(zhuǎn)TTL模塊輸出的是TTL電平不能直接連接RS232設(shè)備USB轉(zhuǎn)RS232線內(nèi)部已經(jīng)做了完整的電平轉(zhuǎn)換輸出的是RS232電平可以直接連接DB9設(shè)備。購買時必須看清標(biāo)題和產(chǎn)品說明。市面上常見的CH340芯片多數(shù)做成USB轉(zhuǎn)TTL模塊約等于把單片機(jī)的串口引腳引到USB口。如果你要用它調(diào)試一個RS232接口的工業(yè)儀表需要在USB轉(zhuǎn)TTL模塊和RS232儀表之間再串一個RS232電平轉(zhuǎn)換電路比如MAX3232模塊。更容易把事情搞亂的是有些“USB轉(zhuǎn)串口線”本身就是USB轉(zhuǎn)RS232線纜末端是一個DB9母頭。這種線內(nèi)部已經(jīng)有轉(zhuǎn)換芯片和電平轉(zhuǎn)換電路不能簡單和USB轉(zhuǎn)TTL小板混用。CH340、CH341、FTDI、CP2102這些都屬于USB轉(zhuǎn)串口芯片。它們負(fù)責(zé)的是USB協(xié)議和UART協(xié)議之間的轉(zhuǎn)換而輸出引腳到底是TTL電平還是RS232電平取決于板卡有沒有額外加電平轉(zhuǎn)換芯片。所以不要一聽說CH340就默認(rèn)它能接RS232設(shè)備。4.5 CH340驅(qū)動與識別問題CH340是國內(nèi)很常見的USB轉(zhuǎn)串口芯片價格低、兼容性也不錯。連接后電腦會自動識別或者安裝驅(qū)動設(shè)備管理器里一般能看到COMx口。需要區(qū)分的是CH340和CH341雖然是同一家廠商的產(chǎn)品但功能有差異。CH341還會支持并口和某些I2C/SPI模式CH340基本上就是轉(zhuǎn)串口。工程調(diào)試中如果看到設(shè)備管理器里不出現(xiàn)串口排查順序通常是檢查USB線是不是只有充電功能不帶數(shù)據(jù)線檢查驅(qū)動是否安裝成功查看設(shè)備管理器中是否出現(xiàn)感嘆號設(shè)備換個USB口尤其是臺式機(jī)前置USB口供電不穩(wěn)時換后置口可能就正常換一臺電腦確認(rèn)芯片是否損壞。另外一個經(jīng)驗很多USB轉(zhuǎn)串口模塊會引出TXD和RXD這兩個引腳的電平是TTL或3.3V不是RS232電平。用萬用表測量時空閑狀態(tài)下TXD是恒定的高電平不是負(fù)電壓。如果你需要用示波器去找一個RS232設(shè)備發(fā)送腳發(fā)現(xiàn)空閑電平是高電平說明它可能不是RS232設(shè)備而是TTL設(shè)備或者轉(zhuǎn)換已經(jīng)做在了設(shè)備內(nèi)部的其他階段測量點沒有落在真正的RS232線路上。5. 串口通信參數(shù)與收發(fā)驗證5.1 常見幀格式和波特率RS232本身是異步串口一次數(shù)據(jù)幀通常包含起始位、數(shù)據(jù)位、校驗位、停止位。常見設(shè)置為8個數(shù)據(jù)位、1個停止位、無校驗簡寫為8N1。波特率常見有9600、19200、38400、57600、115200。單片機(jī)上常跑115200但老式工控儀表、稱重儀表、PLC編程口經(jīng)常停留在9600或者19200。幀格式不一致會導(dǎo)致收到亂碼或者數(shù)據(jù)錯位。調(diào)試前先查對方設(shè)備手冊確認(rèn)波特率、數(shù)據(jù)位、停止位、校驗位。判斷正確與否不是看“設(shè)備上電后串口助手有沒有數(shù)據(jù)”而是看解析結(jié)果能不能穩(wěn)定還原出對方發(fā)送的內(nèi)容。如果收到的字節(jié)間隔規(guī)律但內(nèi)容不可讀可能是波特率不對也可能是數(shù)據(jù)位/校驗位不對。5.2 使用串口調(diào)試助手驗證收發(fā)串口調(diào)試助手是最常用的工具。打開后需要選擇正確的COM口設(shè)置波特率等參數(shù)點擊打開串口。如果設(shè)備在持續(xù)發(fā)送數(shù)據(jù)接收區(qū)就能看到十六進(jìn)制數(shù)據(jù)或者ASCII字符。調(diào)試分三個層次第一個層次看有沒有數(shù)據(jù)。如果什么數(shù)據(jù)都沒有先查線路、接口、驅(qū)動和參數(shù)不要急著改代碼。第二個層次看數(shù)據(jù)對不對。固定發(fā)送一條已知內(nèi)容比如發(fā)送AA 55 01 02 03然后檢查對方接收或者回顯的字節(jié)是否一致。如果收發(fā)一致說明鏈路基本通了。第三個層次看長時間運行穩(wěn)不穩(wěn)定。讓設(shè)備連續(xù)發(fā)送幾千幀統(tǒng)計掉幀、錯幀、亂碼判斷信號質(zhì)量。我在實際調(diào)試中一定會做一次“自發(fā)自收”測試。把RS232設(shè)備的TXD和RXD短接或者用USB轉(zhuǎn)RS232線把自己的TXD和RXD用一根杜邦線短接然后打開串口助手發(fā)送一幀數(shù)據(jù)正常情況下應(yīng)該原樣收到。自發(fā)自收測試能快速驗證USB轉(zhuǎn)串口模塊、驅(qū)動、串口軟件本身是否正常。自收時需要注意RS232電平的自發(fā)自收和TTL電平的自發(fā)自收不能混用。如果你的板子輸出的是TTL電平直接短接自己模塊上的TXD和RXD是可以的因為它內(nèi)部收發(fā)標(biāo)準(zhǔn)一致。如果是RS232設(shè)備請在RS232側(cè)短接TXD和RXD不要在TTL側(cè)短接。5.3 用示波器判斷有沒有信號示波器接在RS232信號線上可以看到空閑時電平在負(fù)電壓發(fā)送數(shù)據(jù)時會出現(xiàn)正負(fù)電平跳變的波形。一個簡單判斷方法如果測量點空閑電平大約在-5V到-12V說明發(fā)送端工作電壓正常發(fā)送數(shù)據(jù)瞬間波形會在正負(fù)之間切換接收側(cè)如果也能看到下降沿和上升沿說明信號至少已經(jīng)到達(dá)接收端。用萬用表也能做一個粗略判斷。正常空閑狀態(tài)下RS232的TXD對GND的電壓是負(fù)的常見是-5V到-12V。如果表測出來是0V可能空閑電平?jīng)]有建立或者根本沒有發(fā)送信號。有些芯片在設(shè)備待機(jī)或未初始化時會禁止發(fā)送端輸出導(dǎo)致腳上是高阻狀態(tài)萬用表也可能測不準(zhǔn)。5.4 三個最常用的串口調(diào)試工具方向串口調(diào)試助手類軟件適合日常快速測試界面直觀串口監(jiān)聽類軟件適合調(diào)試PC軟件和設(shè)備之間已經(jīng)有了專用協(xié)議但不方便改代碼時觀察底層收發(fā)數(shù)據(jù)邏輯分析儀或者示波器適合判斷時序、電平質(zhì)量、字符間隔。新手踩坑最多的是“參數(shù)看著對但數(shù)據(jù)不對”其中很大原因是把波特率搞成了“期望值”而不是“實際值”。比如某個儀表實際是9600但你以為它用115200那么收到的數(shù)據(jù)看起來就是亂碼或者連續(xù)無意義字節(jié)。解決辦法是依次嘗試常用波特率觀察設(shè)備主動上報的數(shù)據(jù)是否能解析出穩(wěn)定含義。6. RS232的局限性與替代方案6.1 RS232為什么不適合長距離和高速通信RS232設(shè)計時就沒有考慮現(xiàn)代高速通信場景它的單端結(jié)構(gòu)決定了抗干擾能力較弱速率和距離互相制約。如果在一個車間里從PLC到上位機(jī)要走幾十米甚至上百米RS232往往不是最佳選擇。此時優(yōu)先考慮RS485。RS485使用差分信號邏輯1和邏輯0由兩根線之間的電壓差表示抗共模干擾能力強(qiáng)支持多點通信傳輸距離可以達(dá)到1200米左右速率遠(yuǎn)高于RS232的常規(guī)應(yīng)用場景。RS422也是差分方式但通常支持一主多從和全雙工適合需要額外反饋或高速率的場景。工控項目里很多“串口屏連PLC”的案例如果用RS232只適合短距離點和點一旦距離超過十幾米或者現(xiàn)場變頻器干擾嚴(yán)重改成RS485往往能解決大部分問題。6.2 RS232轉(zhuǎn)RS485要注意電平差異RS232轉(zhuǎn)RS485模塊內(nèi)部同時處理兩組電平一側(cè)是RS232電平另一側(cè)是RS485差分電平。使用時需要給模塊供電并且確認(rèn)RS232端的TXD、RXD連接正確RS485端的A、B極性不要接反。RS485的A、B接反后通信不會完全沒反應(yīng)有時會出現(xiàn)亂碼、設(shè)備無應(yīng)答或者間歇性通信。很多現(xiàn)場問題看起來是軟件配置錯誤實際是A、B反了。7. RS232接口設(shè)計與排查常見坑7.1 設(shè)計電路時的電平匹配問題如果要在自己設(shè)計的板子上加一個RS232接口畫原理圖時要特別注意轉(zhuǎn)換芯片的電源電壓。TTL端如果連接的是3.3V單片機(jī)不能把5V信號直接進(jìn)IO口需要選擇支持3.3V供電的轉(zhuǎn)換芯片或者在TTL側(cè)做電平適配。另一個容易忽略的問題是地。RS232的地線和數(shù)字地之間是否需要隔離取決于應(yīng)用場景。如果設(shè)備可能連接遠(yuǎn)端設(shè)備兩端地電位可能不一致建議在總線上做好隔離。通信不穩(wěn)定的老設(shè)備檢查是不是地線斷掉或者接成兩個設(shè)備各自獨立接地。7.2 接口防護(hù)不可忽略RS232接口暴露在機(jī)箱外部時容易受到靜電放電、雷擊浪涌以及錯誤接線的影響。比較常見的防護(hù)方式是在信號線上加TVS管也就是瞬態(tài)電壓抑制二極管。另外很多設(shè)備會串聯(lián)電阻做限流配合TVS一起使用。雖然RS232是低速接口不加防護(hù)通常也能跑但一旦設(shè)備使用環(huán)境復(fù)雜接口芯片損壞的概率會明顯升高。排查“串口芯片總是燒”的問題時不要只看芯片型號先檢查現(xiàn)場有沒有誤接外部電源、熱插拔時是否打火、地線是否可靠。芯片損壞往往不是芯片質(zhì)量問題。7.3 通信偶發(fā)失敗時先看日志和時序再改代碼很多人遇到RS232通信偶發(fā)失敗第一反應(yīng)是加大延時或者增加重試次數(shù)。這種做法在演示代碼里也許能解決一部分問題但治標(biāo)不治本。更穩(wěn)妥的順序記錄失敗時機(jī)的規(guī)律是上電初期失敗、運行半小時后失敗還是每次連續(xù)發(fā)數(shù)據(jù)時失敗打開串口監(jiān)聽或示波器看失敗時有沒有數(shù)據(jù)幀幀的長度是否符合預(yù)期看兩根線周圍是否有干擾源變頻器、繼電器、大功率開關(guān)電源都可能是干擾源檢查兩端共地是否可靠降低波特率試一下如果穩(wěn)定說明是信號裕量不足最后才考慮軟件加校驗、重傳機(jī)制。很多看起來像軟件問題最后都落在硬件上。比如“每次開機(jī)第一次通信失敗之后就正常”大概率是目標(biāo)設(shè)備上電初始化慢上位機(jī)發(fā)送時機(jī)太早。解決辦法不是改重試次數(shù)而是增加握手等待或者延時啟動。7.4 長時間運行丟數(shù)據(jù)的處理思路如果RS232鏈路偶發(fā)丟數(shù)據(jù)需要區(qū)分是物理層問題、驅(qū)動緩沖區(qū)問題還是應(yīng)用層處理不及時。物理層問題表現(xiàn)為丟幀與線路干擾有關(guān)波形上有毛刺或者幅值不穩(wěn)定。驅(qū)動緩沖區(qū)問題多見于高波特率、大數(shù)據(jù)量場景接收端程序來不及讀取導(dǎo)致緩沖區(qū)溢出。應(yīng)用層問題則常常是解析協(xié)議時沒有做幀頭校驗和超時處理。軟件上可以做的改進(jìn)是接收端使用環(huán)形緩沖區(qū)提高讀取頻率每次解析前先做長度校驗和校驗值校驗。這些內(nèi)容在串口編程中很常用對于長時間運行的系統(tǒng)尤其重要。8. 新手如何一步步驗證一套RS232通信8.1 準(zhǔn)備一套最小驗證環(huán)境在實驗室里要驗證RS232通信不需要太多東西一個帶TTL串口的開發(fā)板比如STM32、Arduino或者ESP32的開發(fā)板一個MAX3232電平轉(zhuǎn)換模塊一個USB轉(zhuǎn)RS232線或者帶有DB9串口的電腦幾根杜邦線和螺絲刀串口調(diào)試助手軟件。連接方式是單片機(jī)TXD連接TTL模塊的TXD輸入側(cè)對應(yīng)的輸入腳MAX3232模塊的RS232輸出側(cè)連接USB轉(zhuǎn)RS232線。這里容易搞混的是MAX3232模塊上的接口命名。很多模塊把RS232側(cè)接口標(biāo)注為TXD、RXD把TTL側(cè)接口標(biāo)注為RXD、TXD。連接時必須以芯片引腳方向為標(biāo)準(zhǔn)不能用名字想當(dāng)然。8.2 最小驗證的驗收標(biāo)準(zhǔn)完成連接后先做以下幾步不發(fā)送數(shù)據(jù)時用萬用表或示波器測量MAX3232輸出側(cè)TXD空閑電平應(yīng)該為負(fù)電壓打開串口助手選擇對應(yīng)的COM口設(shè)置波特率1152008N1電腦發(fā)送一幀已知數(shù)據(jù)檢查對方設(shè)備是否能收到一致的數(shù)據(jù)對方發(fā)回數(shù)據(jù)電腦如果原樣收到說明收發(fā)鏈路都建立。如果你的單片機(jī)程序是自己寫的可以加上回顯測試收到某個字節(jié)就原樣發(fā)送回來。這套流程成功后再修改波特率、數(shù)據(jù)長度或者接入真實傳感器一步一步擴(kuò)大驗證范圍。8.3 留好日志和測試結(jié)論工程調(diào)試不是跑通一次就結(jié)束。建議把每次試驗使用的波特率、接線方式、線纜長度、芯片型號、輸出波形照片都記錄下來。這樣以后現(xiàn)場出現(xiàn)問題時可以快速和歷史記錄對比。和廠家溝通時如果能給出“我用XX波特率、8N1、三線制連接串口助手自發(fā)自收正常但設(shè)備不回復(fù)”這樣的描述對方也能更快幫你定位問題。最怕的是只說“串口不通”沒有給出可復(fù)現(xiàn)的細(xì)節(jié)。9. 最后留幾個排查RS232問題時的優(yōu)先檢查項如果只讓我保留幾條排查經(jīng)驗我會留下面這幾條先確認(rèn)你面對的是TTL電平還是RS232電平不要混接先接TXD、RXD、GND三根線其中GND絕對不能省先看空閑電平如果TXD對GND不是負(fù)電壓很可能沒發(fā)送信號或接線位置不對用自發(fā)自收排除工具和驅(qū)動問題用示波器看波形比用萬用表可靠軟件上先固定一組最簡單的參數(shù)比如115200、8N1調(diào)通再改復(fù)雜參數(shù)現(xiàn)場有干擾時多試屏蔽線、共地和降低波特率最后考慮加CRC校驗、重傳機(jī)制和數(shù)據(jù)日志不要一上來就堆這些。RS232并不神秘也不是一個過時到不值得學(xué)的老古董。它是理解串口通信、電平標(biāo)準(zhǔn)、接口物理形態(tài)和調(diào)試方法的最佳入口之一。把RS232電平弄明白之后以后去理解RS485差分信號、CAN總線收發(fā)器、傳感器模擬前端都會容易很多。關(guān)鍵是不要停留在一個定義上要拿模塊實際接一遍用示波器看一次波形用串口助手跑一次收發(fā)這一遍走完很多模糊概念就會自己清晰起來。