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