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