教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

單片機(jī)編程的串口協(xié)議介紹

更新時(shí)間:2019年05月09日17時(shí)55分 來(lái)源:單片機(jī)編程 瀏覽次數(shù):

  單片機(jī)串口協(xié)議 六種串口協(xié)議特征及范式

  在現(xiàn)實(shí)生活中,我們總是需要與人打交道,彼此之間毫無(wú)關(guān)系。單片機(jī)是相同的,它需要與各種設(shè)備交互。例如,汽車的顯示儀器需要知道汽車的速度和電機(jī)的運(yùn)行參數(shù),然后顯示儀器需要從汽車的底部控制器獲得數(shù)據(jù)。獲得該數(shù)據(jù)的過(guò)程是一個(gè)通信過(guò)程。類似的例子是控制器通常是單個(gè)芯片或PLC和變頻器之間的通信。溝通的雙方需要遵守一套既定的規(guī)則,也就是協(xié)議,這就像我們之間的對(duì)話,雙方都必須遵守一套語(yǔ)言和語(yǔ)法規(guī)則來(lái)實(shí)現(xiàn)對(duì)話。

單片機(jī)的集中串口協(xié)議介紹

  通信協(xié)議又分為硬件層協(xié)議和軟件層協(xié)議。硬件層協(xié)議主要規(guī)范了物理上的連線,傳輸電平信號(hào)及傳輸?shù)闹刃虻扔布再|(zhì)的內(nèi)容。常用的硬件協(xié)議有串口,IIC, SPI, RS485, CAN和 USB。軟件層協(xié)議則更側(cè)重上層應(yīng)用的規(guī)范,比如modbus協(xié)議。

  好了,那這里我們就簡(jiǎn)單介紹51單片機(jī)的串口通信協(xié)議,以下簡(jiǎn)稱串口。串口的6個(gè)特征如下。

  (1)、物理上的連線至少3根,分別是Tx數(shù)據(jù)發(fā)送線,Rx數(shù)據(jù)接收線,GND共用地線。

  (2)、0與1的約定。RS232電平,約定﹣5V至﹣25V之間的電壓信號(hào)為1,﹢5V至﹢25V之間的電壓信號(hào)為0 。TTL電平,約定5V的電壓信號(hào)為1,0V電壓信號(hào)為0 。CMOS電平,約定3.3V的電壓信號(hào)為1,0V電壓信號(hào)為0 。其中,CMOS電平一般用于ARM芯片中。

  (3)、發(fā)送秩序。低位先發(fā)。

  (4)、波特率。收發(fā)雙方共同約定的一個(gè)數(shù)據(jù)位(0或1)在數(shù)據(jù)傳輸線上維持的時(shí)間。也可理解為每秒可以傳輸?shù)奈粩?shù)。常用的波特率有300bit/s, 600bit/s, 2400bit/s, 4800bit/s, 9600bit/s。

  (5)、通信的起始信號(hào)。發(fā)送方在沒(méi)有發(fā)送數(shù)據(jù)時(shí),應(yīng)該將Tx置1 。 當(dāng)需發(fā)送時(shí),先將Tx置0,并且保持1位的時(shí)間。接受方不斷地偵測(cè)Rx,如果發(fā)現(xiàn)Rx常時(shí)間變高后,突然被拉低(置為0),則視為發(fā)送方將要發(fā)送數(shù)據(jù),迅速啟動(dòng)自己的定時(shí)器,從而保證了收發(fā)雙方定時(shí)器同步定時(shí)。

  (6)、停止信號(hào)。發(fā)送方發(fā)送完最后一個(gè)有效位時(shí),必須再將Tx保持1位的時(shí)間,即為停止位。

  串口協(xié)議開(kāi)發(fā):

  以下解析范式都是采用數(shù)據(jù)隊(duì)列的形似來(lái)存儲(chǔ),并且根據(jù)設(shè)備運(yùn)行速度差異,還需增加數(shù)據(jù)包隊(duì)列來(lái)存儲(chǔ)解析完畢的數(shù)據(jù)包

  1.范式一《固定長(zhǎng)度》無(wú)校驗(yàn)

  0x6B----------20字節(jié)--------0xB6

  上面數(shù)據(jù)中有一個(gè)幀頭0x6B,幀尾0xB6,中間數(shù)據(jù)20個(gè)。

  每次數(shù)據(jù)要找到幀頭0x6B才開(kāi)始存儲(chǔ),讀取完22個(gè)字節(jié)后結(jié)束儲(chǔ)存,并判斷最后一個(gè)字節(jié)是否為0xB6.

  這種范式如果出現(xiàn)誤碼,整個(gè)包就會(huì)變成錯(cuò)誤包,會(huì)比較危險(xiǎn)。

  1.范式二《固定長(zhǎng)度》有校驗(yàn)

  0x6B----------20字節(jié)--------校驗(yàn)-0xB6

  上面數(shù)據(jù)中有一個(gè)幀頭0x6B,幀尾0xB6,中間數(shù)據(jù)20個(gè),幀尾前面有一個(gè)校驗(yàn)碼。

  每次數(shù)據(jù)要找到幀頭0x6B才開(kāi)始存儲(chǔ),讀取完23個(gè)字節(jié)后結(jié)束儲(chǔ)存,并判斷最后一個(gè)字節(jié)是否為0xB6.

  并且判斷校驗(yàn)碼。

  這種范式解決上述出現(xiàn)的誤碼問(wèn)題。

  1.范式三《不固定長(zhǎng)度》無(wú)校驗(yàn)

  0x6B----------N字節(jié)---------0xB6

  上面數(shù)據(jù)中有一個(gè)幀頭0x6B,幀尾0xB6,中間數(shù)據(jù)N個(gè),幀尾前面有一個(gè)校驗(yàn)碼。

  每次數(shù)據(jù)要找到幀頭0x6B才開(kāi)始存儲(chǔ),讀取到0xB6后結(jié)束儲(chǔ)存,并判斷最后一個(gè)字節(jié)是否為0xB6.

  這種范式會(huì)出現(xiàn)錯(cuò)誤解包的問(wèn)題,例如數(shù)據(jù)中出現(xiàn)了0xB6的數(shù)據(jù),這個(gè)包就丟了。

  依然會(huì)有誤碼的問(wèn)題。

  1.范式四《不固定長(zhǎng)度》有校驗(yàn)

  0x6B----------N字節(jié)--------校驗(yàn)-0xB6

  上面數(shù)據(jù)中有一個(gè)幀頭0x6B,幀尾0xB6,中間數(shù)據(jù)N個(gè),幀尾前面有一個(gè)校驗(yàn)碼。

  每次數(shù)據(jù)要找到幀頭0x6B才開(kāi)始存儲(chǔ),讀取到0xB6后結(jié)束儲(chǔ)存,并判斷最后一個(gè)字節(jié)是否為0xB6.

  并且判斷校驗(yàn)碼。

  這種范式解決上述出現(xiàn)的誤碼問(wèn)題。

  這種范式會(huì)出現(xiàn)錯(cuò)誤解包的問(wèn)題,例如數(shù)據(jù)中出現(xiàn)了0xB6的數(shù)據(jù),這個(gè)包就丟了。

  1.范式五《不固定長(zhǎng)度》有校驗(yàn),加入轉(zhuǎn)義字符

  0x6B----------N字節(jié)--------校驗(yàn)-0xB6

  如果數(shù)據(jù)中有0xB6數(shù)據(jù),那么數(shù)據(jù)包就被提前結(jié)束了,并不是我們想要的數(shù)據(jù)。

  這里需要加入轉(zhuǎn)義字符

  0xB6 -> 0xBf,0x01

  0xBf -> 0xBf,0x02

  上面數(shù)據(jù)中有一個(gè)幀頭0x6B,幀尾0xB6,中間數(shù)據(jù)N個(gè),幀尾前面有一個(gè)校驗(yàn)碼。

  每次數(shù)據(jù)要找到幀頭0x6B才開(kāi)始存儲(chǔ),讀取到0xB6后結(jié)束儲(chǔ)存,并判斷最后一個(gè)字節(jié)是否為0xB6.

  并且判斷校驗(yàn)碼。

  需要去解析特定的轉(zhuǎn)義字符

  這種范式解決上述出現(xiàn)的誤碼問(wèn)題。

  這種范式不會(huì)出現(xiàn)錯(cuò)誤解包的問(wèn)題。

  1.范式6《不固定長(zhǎng)度》有校驗(yàn)

  0x6B-0xB6-N數(shù)據(jù)長(zhǎng)度---------N字節(jié)--------校驗(yàn)

  上面數(shù)據(jù)中有一個(gè)幀頭0x6B,0xB6,數(shù)據(jù)長(zhǎng)度,中間數(shù)據(jù)N個(gè),校驗(yàn)碼。

  每次數(shù)據(jù)要找到幀頭0x6B才開(kāi)始存儲(chǔ),讀取到數(shù)據(jù)長(zhǎng)度后讀取對(duì)應(yīng)長(zhǎng)度,再讀取一個(gè)校驗(yàn)碼。

  判斷校驗(yàn)碼即可。

  這種范式解決上述出現(xiàn)的誤碼問(wèn)題。

  這種范式不會(huì)出現(xiàn)錯(cuò)誤解包的問(wèn)題。

0 分享到:
和我們?cè)诰€交談!