国产aaaa级全身裸体精油片_337p人体粉嫩久久久红粉影视_一区中文字幕在线观看_国产亚洲精品一区二区_欧美裸体男粗大1609_午夜亚洲激情电影av_黄色小说入口_日本精品久久久久中文字幕_少妇思春三a级_亚洲视频自拍偷拍

首頁 > 技術(shù)發(fā)展 > 表驅(qū)動(dòng)法在串行通訊協(xié)議解析中的應(yīng)用

表驅(qū)動(dòng)法在串行通訊協(xié)議解析中的應(yīng)用

時(shí)間:2021-10-25 來源: 瀏覽:

表驅(qū)動(dòng)法在串行通訊協(xié)議解析中的應(yīng)用

原創(chuàng) Chinroc 開關(guān)電源仿真與實(shí)用設(shè)計(jì)
開關(guān)電源仿真與實(shí)用設(shè)計(jì)

smps_simulator

plecs, pspice, psim, matlab等仿真軟件應(yīng)用和建模技術(shù)交流,電力電子的數(shù)字與模擬控制的實(shí)用技術(shù)分享與交流

收錄于話題
#代碼 1 個(gè)內(nèi)容
#實(shí)用技術(shù) 35 個(gè)內(nèi)容
  在《單片機(jī)高級(jí)裸編程思想》和《代碼大全2》中,均提到了數(shù)據(jù)驅(qū)動(dòng)程序的編程思想,認(rèn)為數(shù)據(jù)是宇宙的語言。雖然我們可以通過代碼邏輯實(shí)現(xiàn)任務(wù)需求,但容易出現(xiàn)代碼分支眾多,程序難以理解和維護(hù)的困境,但如果我們選擇了正確的數(shù)據(jù)結(jié)構(gòu)并進(jìn)行有條理的整理,并秉持?jǐn)?shù)據(jù)是易變的而邏輯是穩(wěn)定的認(rèn)識(shí),將數(shù)據(jù)和實(shí)現(xiàn)分離,算法則不言自明。數(shù)據(jù)比程序更易駕馭。盡可能把設(shè)計(jì)的復(fù)雜度從代碼轉(zhuǎn)移至數(shù)據(jù)是個(gè)好的實(shí)踐方式。
  所謂表驅(qū)動(dòng)法,也稱C語言映射表(有點(diǎn)函數(shù)中X和Y的取值映射的味道),簡(jiǎn)而言之就是通過查表的方式得到數(shù)據(jù)對(duì)應(yīng)的實(shí)現(xiàn)。此處“表”通常的表現(xiàn)形式是數(shù)組,也認(rèn)為是數(shù)據(jù)庫的一種實(shí)現(xiàn)方式。
  查表的理念在NTC熱敏電阻的測(cè)溫和CRC校驗(yàn)算法中可見一斑。NTC熱敏電阻通常原廠會(huì)給出一張溫度-阻值對(duì)應(yīng)表,程序的一般實(shí)現(xiàn)方式:ADC測(cè)量電壓àNTC電阻à查表獲取溫度值。CRC校驗(yàn)算法通常不會(huì)每次采用對(duì)數(shù)據(jù)采用逐位異或,反復(fù)迭代計(jì)算CRC,而是采用查表計(jì)算得到CRC的方式求解CRC值(當(dāng)然這里涉及到的空間換時(shí)間的理念就不展開了)。舉個(gè)簡(jiǎn)單的例子,如下。
  考試根據(jù)考分計(jì)算成績(jī)等級(jí)。低于60,計(jì)等級(jí)E;60~70,計(jì)等級(jí)D;70~80,計(jì)等級(jí)C;80~90,計(jì)等級(jí)B;90~100,計(jì)等級(jí)A。一般思路關(guān)鍵代碼可實(shí)現(xiàn)如下。
  很顯然,按照上述的編程思路,如果分?jǐn)?shù)段劃分得足夠細(xì),增加更多的分?jǐn)?shù)等級(jí),每增加一個(gè)等級(jí),就要增加一個(gè)流程分支。但查表的思路,則代碼邏輯簡(jiǎn)潔,關(guān)鍵代碼如下。
  很顯然,上述代碼整體觀感上簡(jiǎn)潔很多。同樣的問題,如果細(xì)分更多等級(jí),僅僅只需要修改score_map這個(gè)數(shù)組本身和數(shù)組長(zhǎng)度。相比較而言,第二種查表方法,只需要修改數(shù)據(jù),不需要對(duì)算法的邏輯進(jìn)行增刪操作,當(dāng)然上述偽代碼的數(shù)組長(zhǎng)度是需要宏定義的。顯然上述的思路優(yōu)勢(shì)很明顯:1.可讀性更強(qiáng),消息流程處理一目了然;2.易于維護(hù),如果要增加新的等級(jí),只需要修改數(shù)據(jù),不需要修改流程;3.良好的重用性,將相同的邏輯提取出來,而把容易發(fā)生改變的部分提取到外部。
  查表的方式分為直接查找、索引查找和二分查找等。直接查找即通過數(shù)組下標(biāo)直接獲取數(shù)據(jù),可以看出這種方式就是哈希表的直接訪問法。很顯然,表驅(qū)動(dòng)法是適用于無需有序遍歷數(shù)據(jù),且數(shù)據(jù)量大小可提前預(yù)知的情況。索引查找的基本思想是:首先查找索引表,可用二分查找或順序查找,然后在確定的塊中進(jìn)行順序查找。二分查找則是通過確定數(shù)據(jù)所處的范圍確定分類,但是需要注意邊界,將每一分段范圍的上限值都考慮在內(nèi)。
表驅(qū)動(dòng)在CAN通訊協(xié)議中的應(yīng)用
  背景:CAN總線上掛載若干設(shè)備,其中一個(gè)設(shè)備人為指定為主控,其余設(shè)備人為指定為從控。制定如下通訊協(xié)議:在其擴(kuò)展幀ID中約定了一些位,定義了地址、功能碼、指令碼等功能。那么如何解析主機(jī)可能收到的數(shù)據(jù)幀呢?常規(guī)思路可能有如下偽代碼。
  從上述代碼中可以看到,對(duì)于這種需求,隨著總線上掛載設(shè)備的增多,核心解碼函數(shù)需要不斷增加case分支。以上代碼缺點(diǎn)很多:1.可讀性不高,解析一條CAN指令的處理部分代碼需要跳轉(zhuǎn)3層代碼,隨著分支的增加也給閱讀帶來一定的障礙;2.過多的swicth分支,其實(shí)這也是一種重復(fù)代碼,都有共同特性,可以進(jìn)一步提煉;3.程序缺少核心主干,主干被淹沒在大量的代碼邏輯之中。針對(duì)以上問題,用表驅(qū)動(dòng)法來實(shí)現(xiàn)如下。 根據(jù)上述功能要求,定義3個(gè)枚舉類型: 設(shè)備地址、功能類型和指令類型等,定義如下函數(shù)跳轉(zhuǎn)列表(偽代碼)。
  這種方法好處很明顯:1.提高了程序的可讀性,消息如何處理,查閱驅(qū)動(dòng)表即可,非常明顯;2.減少了重復(fù)代碼,將switch分支進(jìn)行了抽象,將公共的要素進(jìn)行抽象形成了一個(gè)函數(shù)外加一個(gè)可擴(kuò)展的驅(qū)動(dòng)表;3.可擴(kuò)展性,驅(qū)動(dòng)表中的函數(shù)指針就是一個(gè)接口,當(dāng)需要更改功能時(shí),只需要對(duì)驅(qū)動(dòng)表進(jìn)行增刪處理,隔離了變化;4.程序擁有了明顯的主干;5.降低了程序復(fù)雜度,將程序邏輯的復(fù)雜度轉(zhuǎn)移到了數(shù)據(jù)中來,達(dá)到控制復(fù)雜度的目的。
表驅(qū)動(dòng)在ASCII串口通訊協(xié)議中的應(yīng)用
  背景:在某一些通信協(xié)議中,可能存在使用純ASCII作為通信協(xié)議的情形。比如MODBUS ASCII以‘:’開始,以O(shè)D和OA作為結(jié)束符;常用語DTU或者NB-IOT模塊中的AT指令集以“AT+xxx”作為指令等都是較為常見的ASCII指令。這里以若干條指令作為例子,簡(jiǎn)述如下。解析如下指令:信號(hào)強(qiáng)度指令CSQ:17,0; IP地址讀取指令STAIP:192.168.0.1;開機(jī)指令SON,以上指令均以0D和0A作為結(jié)束符。按照常規(guī)的思路代碼如下。
  以上指令借用常規(guī)的MODBUS ASCII協(xié)議,為了簡(jiǎn)便取消以‘:’開頭,很顯然實(shí)際項(xiàng)目中消息還會(huì)不斷增加。此處只列舉了3條指令作為示意,單屏已無法查看全部代碼,閱讀起來十分不便。再者,如果不斷增加消息類型,幾乎很難閱讀這段“意大利面條代碼”了。 那么按照數(shù)據(jù)驅(qū)動(dòng)編程的思路(表驅(qū)動(dòng)法),可以改造成如下代碼。
  顯然這樣的表現(xiàn)形式是比較容易閱讀和維護(hù)的。上述2個(gè)例子利用表驅(qū)法在一般的思路上進(jìn)行優(yōu)化,使程序邏輯更清晰??偨Y(jié)一下,數(shù)據(jù)驅(qū)動(dòng)編程背后的實(shí)現(xiàn)思想包括:
  1. 1.     控制復(fù)雜度,通過把程序邏輯的復(fù)雜度轉(zhuǎn)移到數(shù)據(jù)中,達(dá)到了控制復(fù)雜度的目的。
  2. 2.     隔離變化,把容易變化的消息和不容易變化的邏輯進(jìn)行隔離。
  3. 3.     機(jī)制和策略的分離,機(jī)制就是消息的處理邏輯,策略就是不同的消息處理。這一點(diǎn)可以參考《Unix編程藝術(shù)》的第一章,對(duì)此做了探討。
  當(dāng)然,表驅(qū)法的應(yīng)用還可在GUI菜單邏輯交互、傳感器驅(qū)動(dòng)流程、設(shè)備參數(shù)設(shè)置和修改(多國(guó)語言實(shí)現(xiàn))等等得到應(yīng)用。最后,由于本人太懶(當(dāng)然水平也有限),可能偽代碼邏輯不夠嚴(yán)謹(jǐn),代碼主用于表述表驅(qū)法的實(shí)現(xiàn)思想。下一期內(nèi)容:淺述DES和AES加密。
版權(quán):如無特殊注明,文章轉(zhuǎn)載自網(wǎng)絡(luò),侵權(quán)請(qǐng)聯(lián)系cnmhg168#163.com刪除!文件均為網(wǎng)友上傳,僅供研究和學(xué)習(xí)使用,務(wù)必24小時(shí)內(nèi)刪除。
相關(guān)推薦