工業(yè)串口通信之有話好好說(shuō)
前兩篇文章我們對(duì)工業(yè)上的串口通信(RS232RS422RS485)進(jìn)了簡(jiǎn)單介紹,知道了通信的甲乙雙方如何在物理層面上建立起通信的鏈路。是不是有了這些條件通信的甲乙雙方就可以進(jìn)行溝通了呢?

其實(shí)還是不夠的。這就好比兩個(gè)人打電話,電話線路是通暢的,但是兩個(gè)人說(shuō)的不是同一種語(yǔ)言,一個(gè)人說(shuō)中文,一個(gè)人說(shuō)德文,說(shuō)了半天一句沒聽懂,“你這是弄啥勒”?啪,電話掛掉了。
兩個(gè)講著不同語(yǔ)言的人是無(wú)法進(jìn)行交流的,要想交流,就必須對(duì)語(yǔ)言進(jìn)行統(tǒng)一,比如都用英文,這樣兩個(gè)人就能夠進(jìn)行溝通,愉快的玩耍了。
工業(yè)上的通信和日常說(shuō)話其實(shí)是一樣一樣的,當(dāng)我們把物理上的線路都正確的連接后,還需要對(duì)相互的之間數(shù)據(jù)的發(fā)送接收進(jìn)行相應(yīng)的規(guī)定,這種規(guī)定稱為通信協(xié)議。
通信協(xié)議對(duì)數(shù)據(jù)報(bào)文進(jìn)行了明確的定義,比如:幀的起始信號(hào),結(jié)束信號(hào),數(shù)據(jù)的長(zhǎng)度,校驗(yàn)碼等等。工業(yè)上的通信協(xié)議非常多,比如:Modbus總線協(xié)議;ProfiBus總線協(xié)議,ProfiNet總線協(xié)議,S7 通信協(xié)議;Interbus總線協(xié)議;汽車上用的最廣泛的CAN協(xié)議;及很多基于CAN協(xié)議的如DeviceNet,CanOpen等等。有了這些協(xié)議,通信的甲乙雙方(總線協(xié)議可以有很多通信小伙伴)就可以建立起連接,愉快的交換數(shù)據(jù)了。
今天我們要著重說(shuō)的是串口通信的協(xié)議,稱之為ASCII協(xié)議。該協(xié)議有這樣一些參數(shù):波特率,起始位,數(shù)據(jù)位,停止位,校驗(yàn)位。
1)波特率(baud rate):是指每秒鐘所傳輸?shù)淖址ㄒ卜Q為碼元)的個(gè)數(shù)。注意這里的字符不是字節(jié),不一定是8位。波特率的單位是 “Baud”。
很多小伙伴容易把“波特率”和“比特率”進(jìn)行混淆。比特是英文的"bit"的翻譯,表示二進(jìn)制的“位”。比特率是指每秒鐘所傳輸?shù)奈坏膫€(gè)數(shù),單位為bps(bit per second)。假設(shè)一秒鐘傳輸2個(gè)字節(jié)(一個(gè)字節(jié)有八個(gè)位),比特率就是2*8=16bps。
再回到波特率,假如波特率中的字符(碼元)是這樣定義的:1個(gè)起始位,1個(gè)停止位,8個(gè)數(shù)據(jù)位 。那么碼元的總位數(shù)(bit)=1+1+8=10。在波特率等于9600的情況下,傳輸?shù)谋忍芈?9600*10=96000 bps。
2)起始位:串行通信在空閑的時(shí)候,總線上的電平為高電平(邏輯1),開始傳輸數(shù)據(jù)時(shí),要先把總線上的電平拉低一個(gè)時(shí)間單位(邏輯0),稱為1個(gè)起始位。時(shí)間單位是與波特率相關(guān)的,波特率越高,時(shí)間單位的寬度越窄。起始位不需要設(shè)置,默認(rèn)為1,是包含在數(shù)據(jù)位里的。
2)數(shù)據(jù)位:表示傳輸?shù)臄?shù)據(jù)的位數(shù),范圍是5-8,通常是8位;注意,8位數(shù)據(jù)由于包含了一個(gè)起始位,其有效的數(shù)據(jù)位數(shù)為7位。
3)校驗(yàn)位:
校驗(yàn)是數(shù)據(jù)傳送時(shí)采用的一種校正數(shù)據(jù)錯(cuò)誤的一種方式,通常分為奇校驗(yàn)和偶校驗(yàn),串行通信中可以有如下幾種校驗(yàn)位的選擇:
3.1)奇校驗(yàn)(Odd):數(shù)據(jù)在傳輸過(guò)程中,為1的位(bit)的總數(shù)應(yīng)為奇數(shù);若不是奇數(shù),則校驗(yàn)位=1;若是,則校驗(yàn)位=0;
3.2)偶校驗(yàn)(Even):數(shù)據(jù)在傳輸過(guò)程中,為1的位(bit)的總數(shù)應(yīng)為偶數(shù);若不是偶數(shù),則校驗(yàn)位=1;若是,則校驗(yàn)位=0;
3.3)空位校驗(yàn)(Space):校驗(yàn)位=0
3.4)標(biāo)記校驗(yàn)(Mark):校驗(yàn)位=1
3.5)無(wú)校驗(yàn)(no parity):不使用校驗(yàn)位
4.停止位:當(dāng)一個(gè)字符的數(shù)據(jù)傳輸完成后,要把總線的電平拉高。停止位也是以時(shí)間長(zhǎng)度來(lái)衡量的,通常可以選擇“1”,“1.5”,“2”。以1.5為例,它表示停止位的高電平要保持1.5個(gè)時(shí)間單位的長(zhǎng)度(取決于波特率)。停止位之后總線就轉(zhuǎn)入空閑狀態(tài)等待下次的起始信號(hào)。
下圖就是方正智芯的串口調(diào)試軟件“Como”的串口配置界面(我們后續(xù)文章將會(huì)講到這個(gè)軟件)。

這里注意的是“串口名稱”這一項(xiàng),計(jì)算機(jī)上可能有很多串口,COM1,COM2等,在這里選擇你要使用的是哪個(gè)串口。
細(xì)心的小伙伴可能會(huì)發(fā)現(xiàn),在上圖的界面中,有個(gè)"RTS/CTR使能"的選項(xiàng),這是什么東東呢?這就要說(shuō)到串行通信的“流控制”(handshaking)了。
這里所說(shuō)的“流”,是指數(shù)據(jù)流。數(shù)據(jù)在兩個(gè)串口之間進(jìn)行傳輸時(shí),有時(shí)候會(huì)出現(xiàn)數(shù)據(jù)丟失的情況。因?yàn)殡m然我們配置好了波特率,數(shù)據(jù)位等相關(guān)的信息,但是兩個(gè)串口各自的數(shù)據(jù)處理速度很多時(shí)候是不一樣的。比如臺(tái)式機(jī)與單片機(jī)的通信,當(dāng)單片機(jī)來(lái)不及處理臺(tái)式機(jī)發(fā)來(lái)的數(shù)據(jù)時(shí),就會(huì)造成數(shù)據(jù)緩存區(qū)滿的情況。如果此時(shí)臺(tái)式機(jī)繼續(xù)發(fā)送數(shù)據(jù),單片機(jī)就無(wú)法接收這些數(shù)據(jù),從而造成數(shù)據(jù)丟失。
為了解決串行通信中甲乙雙方數(shù)據(jù)處理速度不同造成的數(shù)據(jù)丟失的情況,聰明的工程師們提出了“流控制”的概念。流控制有兩種:一種是硬件流控制,一種是軟件流控制。
1)硬件流控制。所謂硬件流控制,是指利用硬件線路的電氣信號(hào)進(jìn)行發(fā)送和接收的控制,硬件流控制必須用電纜將相應(yīng)的控制引腳進(jìn)行連接。例如當(dāng)使用RTSCTS這一對(duì)硬件流控制,首先要將通信甲乙雙方的RTS和CTS進(jìn)行連接(如果你不清楚RTS和CTS是什么含義,請(qǐng)參考文章:工業(yè)串口通信之掀起串口的蓋頭)。
下圖是Datalog 掃碼槍硬件流控制(RTSCTS)的示意圖:

當(dāng)掃碼槍要發(fā)送數(shù)據(jù)時(shí),先將RTS的電平拉高,然后檢測(cè)CTS的電平,如果CTS為高電平,則啟動(dòng)數(shù)據(jù)的發(fā)送。如果CTS為低電平,則暫停數(shù)據(jù)的發(fā)送。當(dāng)數(shù)據(jù)發(fā)送完畢時(shí),將RTS的電平拉低。
硬件流控制還可以使用DTR和DSR這一對(duì)連線的信號(hào),和RTSCTS類似,不再贅述。
2)軟件流控制
硬件流控制由于需要相應(yīng)的電纜接線,會(huì)增加項(xiàng)目的成本。在某些對(duì)控制要求不是很嚴(yán)格的場(chǎng)合,可以使用軟件進(jìn)行流控制。軟件流控制一般通過(guò)XOFF和XON來(lái)實(shí)現(xiàn)。還以Datalog的掃碼槍為例,如下圖:

當(dāng)上位機(jī)或PLC(Host)的輸入緩沖區(qū)內(nèi)的數(shù)據(jù)超過(guò)設(shè)定的上限值時(shí)(比如緩沖區(qū)大小的75%),上位機(jī)發(fā)送XOFF字符(13 Hex,表示16進(jìn)制的13)。掃碼槍收到XOFF字符即停止數(shù)據(jù)的發(fā)送。當(dāng)上位機(jī)或PLC(Host)的輸入緩沖區(qū)的數(shù)據(jù)恢復(fù)到正常范圍時(shí),上位機(jī)發(fā)送XON字符(11 Hex,表示16進(jìn)制的11),掃碼槍收到XON字符時(shí),就繼續(xù)發(fā)送數(shù)據(jù)。
軟件流控制可以減少布線的成本,但是在設(shè)計(jì)程序時(shí)必須謹(jǐn)慎使用0x13(13 Hex)和0x11(11 Hex)這兩個(gè)字符作為數(shù)據(jù)包的內(nèi)容,否則很有可能引起軟件的誤操作。
這篇文章我們?cè)敿?xì)介紹了工業(yè)串口通信中各通信參數(shù)的含義及如何配置,并對(duì)通信過(guò)程的“流”控制進(jìn)行了講解,相信到目前為止,你已經(jīng)對(duì)串口通信有了不錯(cuò)的理解了。下一篇文章我們將講解PLC是如何接收發(fā)送串行數(shù)據(jù)的,敬請(qǐng)期待“工業(yè)串口通信之PLC的串口模塊”
長(zhǎng)按掃描下面的二維碼,關(guān)注“方正智芯”的原創(chuàng)文章,提供工業(yè)控制領(lǐng)域的技術(shù)和經(jīng)驗(yàn)的分享,持續(xù)關(guān)注,持續(xù)進(jìn)步。
-
Origin(Pro):學(xué)習(xí)版的窗口限制【數(shù)據(jù)繪圖】 2020-08-07
-
如何卸載Aspen Plus并再重新安裝,這篇文章告訴你! 2020-05-29
-
CAD視口的邊框線看不到也選不中是怎么回事,怎么解決? 2020-06-04
-
教程 | Origin從DSC計(jì)算焓和比熱容 2020-08-31
-
CAD外部參照無(wú)法綁定怎么辦? 2020-06-03
-
CAD中如何將布局連帶視口中的內(nèi)容復(fù)制到另一張圖中? 2020-07-03
