第88節(jié):電子稱連續(xù)不斷從串口對(duì)外發(fā)送數(shù)據(jù),單片機(jī)靠關(guān)鍵字快速截取有效數(shù)據(jù)串
從業(yè)近十年!手把手教你單片機(jī)程序框架 第88講
開(kāi)場(chǎng)白:
我前面串口程序大部分都是通過(guò)靠時(shí)間來(lái)識(shí)別每一串?dāng)?shù)據(jù)是否接收完畢,有一些串口項(xiàng)目的協(xié)議是固定不變的,而且也不需要從機(jī)反饋任何應(yīng)答信號(hào),這類項(xiàng)目只需根據(jù)特定關(guān)鍵字來(lái)快速識(shí)別數(shù)據(jù)串是否接收完畢即可。比如現(xiàn)在有一種電子稱,它的測(cè)量范圍是0.00克到500.00克,他是靠串口不斷對(duì)外發(fā)送當(dāng)前重量數(shù)據(jù)的,每串?dāng)?shù)據(jù)固定長(zhǎng)度26個(gè)字節(jié),最后兩個(gè)字節(jié)是回車換行符0x0d 0x0a,倒數(shù)第9,10,11,12,13,14為有效的ASCII碼數(shù)字,其中倒數(shù)第11位為固定的小數(shù)點(diǎn),其它的數(shù)據(jù)可以忽略不計(jì)。這類串口框架的思路是:根據(jù)數(shù)據(jù)尾是否有0x0d 0x0a來(lái)判斷數(shù)據(jù)串是否有效的,一旦發(fā)現(xiàn)有此關(guān)鍵字,再判斷總的數(shù)據(jù)長(zhǎng)度是否等于或者大于一串?dāng)?shù)據(jù)的固定長(zhǎng)度,如果滿足,則把相關(guān)標(biāo)志位置位,通知主函數(shù)中的串口服務(wù)程序進(jìn)行處理。同時(shí)也及時(shí)關(guān)閉串口中斷,避免在處理串口數(shù)據(jù)期間受到串口數(shù)據(jù)的中斷干擾,等串口服務(wù)程序處理完畢再打開(kāi)。
具體內(nèi)容,請(qǐng)看源代碼講解。
(1) 硬件平臺(tái):
基于朱兆祺51單片機(jī)學(xué)習(xí)板。
(2) 實(shí)現(xiàn)功能:
波特率是:9600。把當(dāng)前電子稱的重量數(shù)據(jù)顯示在數(shù)碼管上,在電腦上用串口助手軟件來(lái)模擬電子稱發(fā)送以下格式協(xié)議的3串?dāng)?shù)據(jù),它的協(xié)議很簡(jiǎn)單,每串?dāng)?shù)據(jù)固定長(zhǎng)度26個(gè)字節(jié),最后兩個(gè)字節(jié)是回車換行符0x0d 0x0a,倒數(shù)第9,10,11,12,13,14為有效的ASCII碼數(shù)字,其中倒數(shù)第11位為固定的小數(shù)點(diǎn),其它的數(shù)據(jù)可以忽略不計(jì)。
(a)字符是:
ST,GS,+ 0.77 g
轉(zhuǎn)換成16進(jìn)制是:
20 53 54 2C 47 53 2C 2B 20 20 20 20 20 20 30 2E 37 37 20 2020 20 20 67 0D 0A
數(shù)碼管顯示:0.77
(b)
字符是:
ST,GS,+ 136.39 g
轉(zhuǎn)換成16進(jìn)制是:
20 53 54 2C 47 53 2C 2B 20 20 20 20 31 33 36 2E 33 39 20 2020 20 20 67 0D 0A
數(shù)碼管顯示:136.39
(c)
字符是:
ST,GS,+ 0.00 g
轉(zhuǎn)換成16進(jìn)制是:
20 53 54 2C 47 53 2C 2B 20 20 20 20 20 20 30 2E 30 30 20 2020 20 20 67 0D 0A
數(shù)碼管顯示:0.00
(3)源代碼講解如下:
總結(jié)陳詞:
前面我在第48節(jié)里講過(guò)用ds1302做的時(shí)鐘程序,但是后來(lái)很多網(wǎng)友建議,為了方便初學(xué)者學(xué)習(xí)編程思路,我應(yīng)該用單片機(jī)定時(shí)器做一個(gè)時(shí)鐘程序。因此,我決定下一節(jié)講這方面的內(nèi)容。欲知詳情,請(qǐng)聽(tīng)下回分解----用單片機(jī)內(nèi)部定時(shí)器做一個(gè)時(shí)鐘。