下面先講一講串口通信的一些基本概念敢朱,術(shù)語。如果對串口通信比較熟悉的摩瞎,就當(dāng)復(fù)習(xí)復(fù)習(xí)拴签,如果哪里講錯或不到位,也可以及時指出旗们,當(dāng)作一塊交流交流篓吁。
這里并不對串口的編程作講解,主要是從應(yīng)用的角度去講一講蚪拦。因為更多的時候杖剪,都是產(chǎn)品做好了,比如觸摸屏需要和控制器驰贷,PLC通信盛嘿。理想的情況下,一般只要一上電括袒,不需要太多的操作和配置次兆,就可以通信上。
在這里羅列了一些問題锹锰,待會對這些問題講一講芥炭,看是否有類似的情況漓库,也許可以一起交流分享。
1 電腦使用USB轉(zhuǎn)串口可以和設(shè)備通信上园蝠,換成屏與設(shè)備就通信不上了渺蒿。
2 這A家的屏可以和設(shè)備通信,換成B家的屏就通信不上了彪薛。
3 以前不接地線可以通信茂装,換個設(shè)備為什么需要接地線了。
4 一個設(shè)備是232善延,另一個設(shè)備是422少态,沒有轉(zhuǎn)換設(shè)備,怎么辦易遣。(232與422互轉(zhuǎn)的簡單方法)
5 用232通信沒問題彼妻,用485通信沒問題,使用232轉(zhuǎn)485之后就通信不穩(wěn)定豆茫。
6 485單獨接每個設(shè)備都通信正常澳骤,多個從站接一塊通信就不穩(wěn)定。
7 要想實現(xiàn)兩個屏或兩個主站通過485訪問modbus設(shè)備澜薄,有什么好的辦法为肮。
8 針對串口通信的弱點,在使用上應(yīng)該要注意哪些地方肤京。
當(dāng)然有可能實際遇到的還不只是這些問題颊艳,可能還有一些意想不到的問題,如果你還遇到過什么奇葩奇怪的問題忘分,也可以留言棋枕,一塊交流探討,一定會知無不言妒峦,言而無盡重斑。
要回答和解決以上這些問題,還需要先了解一下什么是串口通信肯骇,232窥浪,485,422等笛丙。
什么是串口通信
常見的串口通信一般是指異步串行通信漾脂。
這里就要說一下同步和異步的區(qū)別了。
算了胚鸯,還是先講一下串行通信的概念骨稿。那么,與串行通信相對的是什么呢。
與串行通信相對的是并行通信坦冠。數(shù)據(jù)傳輸一般都是以字節(jié)傳輸?shù)男魏模粋€字節(jié)8個位。拿一個并行通信舉例來說辙浑,也就是會有8根線激涤,每一根線代表一個位。一次傳輸就可以傳一個字節(jié)例衍,而串口通信,就是傳數(shù)據(jù)只有一根線傳輸已卸,一次只能傳一個位佛玄,要傳一個字節(jié)就需要傳8次。就像小虎隊那首歌一樣累澡,把你的心梦抢,我的心,串一串愧哟,再烤一烤奥吩。。串口通信就是把數(shù)據(jù)串在一根線上傳輸蕊梧,所以就叫串口吧霞赫。
與異步通信相對的就是同步通信了。同步通信一般是指有一個時鐘信號進(jìn)行數(shù)據(jù)信號同步肥矢。同步通信對接收方來說就相對簡單一些端衰。因為有時鐘信號在,每一個高低電平變化一下甘改,就去取一下數(shù)據(jù)就行了旅东。通信速率可以由發(fā)送方或者說是主站設(shè)備進(jìn)行控制。通信速度也相對比串口通信快很多十艾。但是為什么很多設(shè)備抵代,屏和plc,控制器不采用這種方式忘嫉,都使用串口呢荤牍。
那么,在很多設(shè)備上庆冕,不方便接太多線参淫,比如接8根數(shù)據(jù)線,也不方便接同步時鐘信號(這個后面再說)愧杯,于是一種異步串行通信就誕生了涎才。
相對來說,異步串口通信,就只需要一根線就可以發(fā)送數(shù)據(jù)了耍铜。在對速率要求不高的情況邑闺,使用一根線發(fā)送數(shù)據(jù)是帶來大大的方便和實用價值的。
那么問題來了棕兼,怎么樣才能保證一根線就能發(fā)送正常的數(shù)據(jù)呢陡舅。也就說發(fā)送方發(fā)送的數(shù)據(jù),接收方是怎么知道是什么數(shù)據(jù)呢伴挚。
為了能正常發(fā)送數(shù)據(jù)和接收正確的數(shù)據(jù)靶衍,那異步串口通信就需要滿足以下幾個條件:
也就是雙方必要約定一種暗號。
也許當(dāng)時發(fā)送這個通信的小組是這樣討論的茎芋。
經(jīng)理:我要用一根線就能傳輸數(shù)據(jù)颅眶,你來給我定個標(biāo)準(zhǔn)。
研發(fā):好田弥。
經(jīng)理:只有一根線涛酗,我怎么知道數(shù)據(jù)什么時候開始呢。
研發(fā):就一根線偷厦,默認(rèn)是高電平商叹,那就有一個起始位吧。當(dāng)檢測到有低電平的時候只泼,就是開始有一個字節(jié)的數(shù)據(jù)發(fā)送了,起始位之后剖笙,先是字節(jié)的最低位,傳送一個字節(jié)。
經(jīng)理:可是请唱,就一根線枯途,過來的數(shù)據(jù)會不會有干擾,容易出錯呀籍滴。
研發(fā):行呀酪夷,那就在字節(jié)數(shù)據(jù)后再加一個校驗位∧醵瑁可以作奇校驗晚岭,偶校驗,1校驗勋功,0校驗坦报,無校驗。
經(jīng)理:嗯 狂鞋,很不錯片择。有起始位就應(yīng)該有停止位,那我們就再加個停止位在后面吧骚揍。
研發(fā):字管。啰挪。。嘲叔。亡呵。。硫戈。锰什。。
經(jīng)理:傳輸一串?dāng)?shù)據(jù)丁逝,對方要怎么知道數(shù)據(jù)的拆分呢汁胆,怎么按時間或頻率去解讀數(shù)據(jù)位,校驗位呢霜幼。
研發(fā):這樣吧嫩码,雙方約定一個波特率吧,定義一個每個位占用多長的時間辛掠,這樣雙方按這個波特率就可以處理了谢谦。
經(jīng)理:這個比特率呀释牺。萝衩。。
研發(fā):老板没咙,是波特率猩谊。
經(jīng)理:我知道,是比特率嘛祭刚。
研發(fā):這個波特率呢牌捷,是指1S鐘可以傳輸多個位,也就知道一個位占用多長時間涡驮。這樣就解決傳輸?shù)膯栴}了暗甥。
經(jīng)理:那萬一傳輸過程,數(shù)據(jù)快太捉捅,判斷失誤停不下來怎么辦撤防。
研發(fā):那就把停止位可以調(diào)節(jié)為1個停止位或者2個停止位。這樣就可以停下來了棒口。
經(jīng)理:嗯寄月,聽著不錯。就這樣辦吧无牵。
于是漾肮,串口通信就這樣出來了。
在串口的通信參數(shù)上茎毁,就有了波特率克懊,數(shù)據(jù)位,停止位,校驗位這幾個參數(shù)來確保串口通信的正確性和穩(wěn)定上保檐。當(dāng)然耕蝉,這只是某個方面保證串口通信的正確性和穩(wěn)定性,不代表設(shè)備間通信的正確性和穩(wěn)定性夜只。
串口通信主要為分232垒在,485,422 通信三種方式扔亥。
這三種有什么區(qū)別呢场躯。
232:
232 通信主要是由RX,TX,GND三根線組成。
RX與TX旅挤,TX接RX踢关,GND接GND。這樣還是比較好理解吧粘茄。因為發(fā)送和接收分別是由不同的線處理的签舞,也就是能同時發(fā)送數(shù)據(jù)和接收數(shù)據(jù),這就是所謂的全雙工柒瓣。
在這里擴(kuò)展一下儒搭,串口通信還有一個功能叫做全功能串口通信,也叫標(biāo)準(zhǔn)串口芙贫。因為在兩個設(shè)備間進(jìn)行數(shù)據(jù)傳輸搂鲫,有些設(shè)備處理速度比較快,有些數(shù)據(jù)比較慢磺平。為了保證數(shù)據(jù)能正常傳輸魂仍,在RX,TX的基礎(chǔ)上,還增加了幾個控制引腳拣挪,本來好端端就R擦酌,T,G菠劝,三根線赊舶,湊著就湊齊了9個引腳,召喚出了DB9這個東西闸英。
這要怪就怪當(dāng)時使用電腦的時候锯岖,還沒有互聯(lián)網(wǎng)這個概念,但是又想在兩臺電腦間進(jìn)行通信甫何。所以才有這樣一個東西出吹。
在后來的設(shè)備,很多控制器辙喂,人機(jī)界面捶牢,PLC等使用串口通信中鸠珠,基本上就不使用標(biāo)準(zhǔn)串口,而是就直接使用RX秋麸,TX渐排,GND三根線來通信了。
但是這里為什么要提到這個呢灸蟆。因為只是很多設(shè)備這樣用驯耻,也就是還存在少數(shù)設(shè)備還保留了標(biāo)準(zhǔn)串口的功能。這就是為什么會遇到明明電腦通信是好的炒考,換成觸摸屏通信就不行了可缚。因為很多觸摸屏只使用了RX,TX斋枢,GND通信帘靡,遇到一些還保留標(biāo)準(zhǔn)串口功能的就比較討厭了。
485:
485是為了解決232通信距離的問題瓤帚。原理什么之類的就不多講了描姚。反正232通信距離就是不長。485主要是以一種差分信號進(jìn)行傳輸戈次,只需要兩根線轩勘,+,-兩根線,或者也叫A朝扼,B兩根線赃阀。A霎肯,B兩根線的差分電平信號就是作為數(shù)據(jù)信號傳輸擎颖。那么問題來了,那是不是就沒有RX和TX的概念了观游。是的搂捧,發(fā)送和接收就不能分開了。發(fā)送和接收都是靠這兩根的來傳輸懂缕,也就是每次只能作發(fā)送或者只能作接收允跑,這就是半雙工的概念了,這在效率上就比232弱很多了搪柑。就像對講機(jī)一樣聋丝,經(jīng)常是某個人講完之后,都要說一個over工碾,確保當(dāng)前說完了弱睦,等待對方回復(fù)。
485就是這樣犧牲了232全雙工的效率來達(dá)到自己傳輸距離遠(yuǎn)的代價渊额。那有沒有即保留了232的全雙工况木,又可以像485這樣提高傳輸距離呢垒拢,于是,422出來了火惊。
422:
422呢求类,有些標(biāo)注為485-4。而485就標(biāo)注為485-2屹耐。有什么區(qū)別呢尸疆。就是為了好記呢。485-2就是2根線惶岭。485-4就是4根線仓技。
422就是把232的RX分成兩根線,RX+俗他,RX-脖捻,把TX分成TX+,TX-。這樣就可以同時發(fā)送和同時接收了兆衅,還可以像485這樣地沮,有較遠(yuǎn)的傳輸距離∠勰叮可是這樣一種很有優(yōu)勢的通信方式摩疑,為什么用的不多呢。我個人的答案和理解就是:線太多了畏铆。特別是像我這樣懶得接線的人雷袋,超過3根線就頭暈的。搞個通信還需要接這么多線辞居,什么TX,RX楷怒,正啊負(fù)啊。交換來交換去瓦灶。
因為在很多設(shè)備通信中鸠删,基本上是屬于一問一答式的,因此贼陶,232的全雙工通信優(yōu)勢其實也并沒有發(fā)揮出來刃泡。就像現(xiàn)在打電話,雖然兩個人可以同時說話碉怔,但是兩個人同時說話烘贴,嘰嘰歪歪的,誰知道說什么呀撮胧。特別是一個主站與多個從站通信的時候桨踪,485的接線就就方便多了,反正大家就兩根線趴樱,把+都接一塊馒闷,把-都接一塊酪捡。如果是422作一主多從,接線上還要理半天呢纳账,而且通信異常了也不好解決逛薇。
好了,串口通信基本就普及到這里吧疏虫。下面就對剛上提到的問題進(jìn)行講一講吧永罚,聊一聊吧。
1卧秘、電腦使用USB轉(zhuǎn)串口可以和設(shè)備通信上呢袱,換成屏與設(shè)備就通信不上了。
1)有可能電腦USB轉(zhuǎn)串口接到設(shè)備上翅敌,使用的是標(biāo)準(zhǔn)串口功能羞福,也就是除了RX,TX蚯涮,GDN外治专,還使用了其它引腳。比如像歐姆龍PLC遭顶,三菱PLC张峰,在實際與屏的通信中,就需要接某些引腳短接的情況棒旗。
2)電腦與控制器或PLC通信時喘批,是掃描波特率參數(shù),自適應(yīng)的铣揉,屏通信可能參數(shù)沒有設(shè)備好饶深。在三菱,基恩士等PLC老速,就存在變化波特率進(jìn)行通信交互的過程粥喜。
3)也有可能是接線方式不對凸主。因為有些DB9橘券,還需要公頭,母頭卿吐。如果不注意的話旁舰,也會存在把TX接到TX上,把RX接到RX上嗡官,這樣需要注意的地方箭窜。
4) 在這里補充一下,有時候可能會使用一些串口助手發(fā)送測試數(shù)據(jù)與控制器通信衍腥,有些串口助手的奇偶校驗是不起作用磺樱,這個要提醒一下纳猫。
2、這A家的屏可以和設(shè)備通信竹捉,換成B家的屏就通信不上了芜辕。
1) 首先確認(rèn)一下接線是否正確了,RX和TX是否兼容块差。
2) 地線是否沒有接侵续。
3) 除了RX,TX憨闰,GND状蜗,是否還有其它引腳需要短接的。
4) 通信協(xié)議是否一致或不完善鹉动,波特率是否一樣轧坎。
3、以前不接地線可以通信泽示,換個設(shè)備為什么需要接地線了眶根。
1)這個問題和上一個有類似的。因為有些設(shè)備使用了隔離電源边琉。以前不接地可以通信属百,有可能是地線已經(jīng)在另外一個環(huán)路已經(jīng)共地了,實際地線已經(jīng)接了变姨,所以才可以通信族扰。可能換了個帶隔離電源的定欧,兩個設(shè)備的地是隔離的渔呵,就需要在串口上把地線接起來。這個我是自身經(jīng)歷過的砍鸠,有個客戶老說他的設(shè)備通信不上扩氢,后來拍個照我給我,他地線沒有接爷辱,他說以前不接地線可以通信的录豺。于是我就給他科普了一下。
4饭弓、一個設(shè)備是232双饥,另一個設(shè)備是422,沒有轉(zhuǎn)換設(shè)備弟断,怎么辦咏花。(232與422互轉(zhuǎn)的簡單方法)
這個情況我遇到過,客戶的設(shè)備是422通信的阀趴,但是我手上并沒有422設(shè)備昏翰,只有232通信可以測試苍匆。因此就需要把422轉(zhuǎn)成232進(jìn)行通信。
剛才也講了422和232的接線棚菊,因為這兩個都是全雙工的锉桑,接收和發(fā)送都是分到的,而422只是以一種差分信號進(jìn)行傳輸窍株。
把422的Rx+與232的TX接民轴,422的RX-與232的GND接。
把422的TX+與232的RX接球订,422的TX-與232的GDN接后裸。
這樣,422設(shè)備要發(fā)送數(shù)據(jù)的冒滩,就可以發(fā)送到了232的RX上微驶。232的TX發(fā)數(shù)據(jù)后,由于TX和GND也形成了差分信號給422开睡,422就可以接收到數(shù)據(jù)了因苹。
5、用232通信沒問題篇恒,用485通信沒問題扶檐,使用232轉(zhuǎn)485之后就通信不穩(wěn)定。
232和485從通信原理上胁艰,最大一個差別是全雙工和半雙工的區(qū)別款筑。可是應(yīng)用層發(fā)送數(shù)據(jù)和接收數(shù)據(jù)才不管底下是全雙工還是半雙工腾么。
但是485就得管了奈梳。因為既然是半雙工,就得嚴(yán)格保證通路上只能有發(fā)送或只能有接收的數(shù)據(jù)解虱,一旦同時有發(fā)送和接收攘须,數(shù)據(jù)就會沖突了。所以解決的辦法就是主站設(shè)備殴泰,也就是主動命令的一方就需要嚴(yán)格控制好發(fā)送數(shù)據(jù)命令的節(jié)奏了于宙。當(dāng)然有些232轉(zhuǎn)485的設(shè)備做的比較好了,可以優(yōu)化這個艰匙,但是主站還是要控制限煞,比較把通信速率調(diào)節(jié)慢一些(不是調(diào)節(jié)波特率)。
6员凝、485單獨接每個設(shè)備都通信正常,多個從站接一塊通信就不穩(wěn)定奋献。
7健霹、要想實現(xiàn)兩個屏或兩個主站通過485訪問modbus設(shè)備旺上,有什么好的辦法。
在485通信中糖埋,基本上是一主多從宣吱。但是遇到一些客戶實際使用中,有客戶想用兩個屏來訪問一個modbus設(shè)備的瞳别。目前暫時還沒有好的辦法征候。等這個功能出來后,再來給大家演示操作吧祟敛。
8疤坝、針對串口通信的弱點,在使用上應(yīng)該要注意哪些地方馆铁。
說來串口通信的弱點跑揉,那就說來話長了。不過還是長話短說吧埠巨。
1)信號干擾的問題历谍。
建議使用帶屏蔽線,接線要嚴(yán)格辣垒,比如要接地望侈。有些485通信上,還考慮接上終端電阻來匹配勋桶。如果是232甜无,盡量不要讓線太長。通信協(xié)議上盡量避免長報文的數(shù)據(jù)通信哥遮。
2)波特率匹配的問題岂丘。
因為有些設(shè)備的計算的波特率是存在誤差的,特別是一些控制器眠饮,由于使用的晶振不一樣奥帘。因此在一些波特率比如9600波特率就存在誤差。存在誤差帶來的影響是什么呢仪召。因為接收方是通過時間來計算一個位的寨蹋。那么如果一個報文過長,就會存在誤差積累的問題扔茅,算著算著就偏了已旧。所以,這也是串口通信不穩(wěn)定的一些地方召娜,在使用上應(yīng)注意避免發(fā)送太長數(shù)據(jù)的包运褪。
3)在一些可能會存在干擾的情況,在有的選的情況,可以考慮使用奇校驗或者偶校驗秸讹。因為雖說出現(xiàn)錯誤的可能性不大檀咙,但既然存在干擾,如果加了校驗璃诀,至少可以把錯誤的報文過濾掉弧可。總好比沒有校驗然后通信數(shù)據(jù)錯了不知道劣欢∽厮校或者盡量使用一些帶校驗的協(xié)議,防止數(shù)據(jù)出錯凿将。
4) 串口通信本來就比較慢校套,請降低對數(shù)據(jù)響應(yīng)的要求。
因為串口通信本身就比以太網(wǎng)慢丸相。而且搔确,串口通信并不是能像CPU那樣多線程處理。因為就一個口一個線數(shù)據(jù)出去灭忠,即便你應(yīng)用到程序再怎么用多線程處理數(shù)據(jù)膳算,但是最底下也只有一個口出去,一次也只能傳一個位弛作,一個字節(jié)過去涕蜂。因為有客戶在使用9600的波特率通信,但是又希望多少的數(shù)據(jù)可以在多少毫秒內(nèi)得到響應(yīng)映琳。
但是串口通信還是要事實求是机隙,所以正確認(rèn)識串口通信對應(yīng)用,對開發(fā)萨西,對溝通都有著很大的幫助的有鹿。
好了。關(guān)于串口通信方面谎脯,就暫時聊到這里了葱跋。
為什么不用同步通信呢。
剛才提到源梭,同步通信需要依賴于時鐘信號娱俺。這就存在一個問題,這個時鐘信號是誰來發(fā)起呢废麻。在同步通信中荠卷,往往需要一個主設(shè)備發(fā)起時鐘信號讀從模塊的數(shù)據(jù)。在實際中烛愧,有屏讀PLC油宜,有屏讀屏的數(shù)據(jù)掂碱。而單純地從異步串口通信來說,是沒有主從之說验庙,雙方都是平等的角色顶吮,都可以互發(fā)信息社牲,互收信息粪薛。而同步通信一般是應(yīng)用于CPU讀一些模塊,由CPU發(fā)起時鐘信號搏恤,比如讀SD卡模塊违寿,就可以通過SPI方式,還有一些傳感器模塊熟空。