當(dāng)我們知道了工業(yè)上串口通信(RS232\RS422\RS485)通信的甲乙雙方如何在物理層面上建立起通信的鏈路认境。是不是有了這些條件通信的甲乙雙方就可以進(jìn)行溝通了呢胚委?
其實(shí)還是不夠的。這就好比兩個(gè)人打電話叉信,電話線路是通暢的亩冬,但是兩個(gè)人說(shuō)的不是同一種語(yǔ)言,一個(gè)人說(shuō)中文硼身,一個(gè)人說(shuō)德文硅急,說(shuō)了半天一句沒(méi)聽(tīng)懂,“你這是弄啥勒”鸠姨?啪铜秆,電話掛掉了淹真。
兩個(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)饿序,開(kāi)始傳輸數(shù)據(jù)時(shí),要先把總線上的電平拉低一個(gè)時(shí)間單位(邏輯0)友题,稱為1個(gè)起始位嗤堰。時(shí)間單位是與波特率相關(guān)的,波特率越高,時(shí)間單位的寬度越窄踢匣。起始位不需要設(shè)置告匠,默認(rèn)為1,是包含在數(shù)據(jù)位里的离唬。
3)數(shù)據(jù)位:表示傳輸?shù)臄?shù)據(jù)的位數(shù)后专,范圍是5-8,通常是8位输莺;注意戚哎,8位數(shù)據(jù)由于包含了一個(gè)起始位,其有效的數(shù)據(jù)位數(shù)為7位嫂用。
4)校驗(yàn)位:校驗(yàn)是數(shù)據(jù)傳送時(shí)采用的一種校正數(shù)據(jù)錯(cuò)誤的一種方式型凳,通常分為奇校驗(yàn)和偶校驗(yàn),串行通信中可以有如下幾種校驗(yàn)位的選擇:
4.1)奇校驗(yàn)(Odd):數(shù)據(jù)在傳輸過(guò)程中嘱函,為1的位(bit)的總數(shù)應(yīng)為奇數(shù)甘畅;若不是奇數(shù),則校驗(yàn)位=1往弓;若是疏唾,則校驗(yàn)位=0;
4.2)偶校驗(yàn)(Even):數(shù)據(jù)在傳輸過(guò)程中函似,為1的位(bit)的總數(shù)應(yīng)為偶數(shù)槐脏;若不是偶數(shù),則校驗(yàn)位=1撇寞;若是顿天,則校驗(yàn)位=0;
4.3)空位校驗(yàn)(Space):校驗(yàn)位=0
4.4)標(biāo)記校驗(yàn)(Mark):校驗(yàn)位=1
4.5)無(wú)校驗(yàn)(no parity):不使用校驗(yàn)位
5)停止位:當(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”的串口配置界面迫肖。
這里注意的是“串口名稱”這一項(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)使用RTS\CTS這一對(duì)硬件流控制,首先要將通信甲乙雙方的RTS和CTS進(jìn)行連接渴语。
下圖是Datalog 掃碼槍硬件流控制(RTS\CTS)的示意圖:
當(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)且轨,和RTS\CTS類似,不再贅述。
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)容咪鲜,否則很有可能引起軟件的誤操作。
文章來(lái)源:電氣系? (全網(wǎng)同名)