<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 牛人業(yè)話(huà) > 通信協(xié)議文本化到底有多重要?老司機來(lái)告訴你

通信協(xié)議文本化到底有多重要?老司機來(lái)告訴你

作者:小么哥 時(shí)間:2020-04-29 來(lái)源:電子產(chǎn)品世界 收藏

劉慈欣在其封神之作《三體》里描述過(guò)三體人的交流方式:倆人就這么站著(zhù)不說(shuō)話(huà),四目相交,天雷引著(zhù)地火,腦電波你來(lái)我往。沒(méi)有時(shí)延,不用等待,頃刻間便心與心相印,魂與魂深交,想來(lái)就十分美好。

本文引用地址:http://dyxdggzs.com/article/202004/412589.htm

相比之下,人類(lèi)通過(guò)“語(yǔ)言”把隱晦的思考隱藏在幽微的心底,審時(shí)度勢,鼓舌如簧,說(shuō)言不由衷的話(huà),撒漫不經(jīng)心的謊。

大劉在《三體》里,將此視為地球人類(lèi)對三體人的一大優(yōu)勢。上兵伐謀,兵不厭詐,在宇宙這座黑暗森林中,只有善于隱藏和偽裝,才能更好地生存。

是的,語(yǔ)言是一門(mén)隱藏真實(shí)的藝術(shù)。

其實(shí),它不只在人類(lèi)世界如此,在電子設備之間依然如斯。在電子設備之間,它有一個(gè)專(zhuān)業(yè)性的稱(chēng)謂:。

電子工程師對“”這個(gè)詞匯耳熟能詳,如數家珍。平時(shí)掛在嘴邊的就有USB、RS232、CAN、LIN、ModBus、RS485、SPI、I2C、Zigbee、紅外、藍牙、WiFi......

”也許是一個(gè)定義模糊的詞匯,因為,嚴格說(shuō)起來(lái),上面列舉的都是通信標準,或有線(xiàn)或無(wú)線(xiàn),或廣域或局域,或遠程或短距,而且它們大多只是定義了物理層、鏈路層協(xié)議,當然有的還包含了傳輸層和會(huì )話(huà)層。

但是筆者今天想要跟大家探討的則是基于這些通信鏈路之上的應用層協(xié)議。

應用層協(xié)議和終端應用密切相關(guān),就拿筆者比較熟悉的藍牙來(lái)說(shuō),針對車(chē)載免提有HFP協(xié)議,針對電話(huà)本傳輸有PBAP協(xié)議,針對耳機有A2DP、AVRCP協(xié)議......

除了這些針對特定場(chǎng)景具體應用制定了貼心協(xié)議的通信標準之外,有很多場(chǎng)合是需要工程師自己制定應用協(xié)議的,比如今天筆者要跟大家分享的測試工裝上位機和下位機之間的通信協(xié)議。

一把鑰匙一把鎖,一桿鋼筆一只筆帽,倚天劍得配個(gè)劍鞘,量產(chǎn)產(chǎn)品肯定需要測試工裝一套。

測試工裝咱就不多費筆墨了,總之就是上位機和下位機之間用串口或者USB,然后用類(lèi)似于下面的老套通信協(xié)議互發(fā)報文:

報文頭(設為0x55+0xaa)+id(報文的ID)+data_len(數據長(cháng)度)+data+checksum

大家伙對這種樣式的通信協(xié)議肯定是熟得不能再熟了,以至于可能熟視無(wú)睹,根本沒(méi)有意識到這里有哪些不對勁。

想想看,如果這種通信協(xié)議下的報文流出了問(wèn)題,我們想搭眼看看哪里出了錯,是很難一看就看出個(gè)所以然的。

報文背后的信息就好像蒙了一層面紗,猶抱琵琶半遮面,千呼萬(wàn)喚不出來(lái)。

我們需要把協(xié)議文檔翻出來(lái),一條一條地比照才能知道這里的id到底對應的是哪一條具體的測試項,這里的數據到底表示什么意思。

不過(guò)好在,我們只要嚴格地按照報文格式封裝和解析這些報文,并保證報文的消費(解析)速度高過(guò)生產(chǎn)(接收)速度,干完這些dirty work之后我們就不需要關(guān)心它是不是那么朦朧難辨了。

畢竟,最終執行這些協(xié)議的都是計算機和電子設備,而這正是它們的強項。

所以,直到現在,我依然能夠想起幾年前采用這種方式做測試工裝時(shí)的那種心情:

九月里,平淡無(wú)聊,一切都好,只缺煩惱。

直到有一天,我和報文里的內容打起了交道。

本來(lái),時(shí)光悠悠,歲月靜好,一切的一切都充滿(mǎn)了幸福的味道。

小張按照上文那種報文格式把某個(gè)測試項的請求發(fā)下來(lái),我啟動(dòng)具體的測試,把測試數據發(fā)給他,他按照測試項的具體功能邏輯,通過(guò)測試數據判斷測試是否通過(guò)。

時(shí)間滴滴答答,客戶(hù)端(上位機)和服務(wù)器(下位機)的請求和響應也沒(méi)有出過(guò)岔。

可是不知怎的,許是我改了改程序,又或者小張動(dòng)了動(dòng)代碼,那天下午出現了本該測試通過(guò)的測試項失敗的情況。

于是乎,秋高氣爽,艷陽(yáng)高照,我和小張打起了嘴炮。

頂著(zhù)沖冠的怒發(fā),小張污我有的報文會(huì )漏發(fā),我不留情面地說(shuō)他的水平不到家,不知道用個(gè)buffer把接收的報文先緩存一下下。

為了證明報文不會(huì )漏發(fā),我用工裝上多余的串口接上電腦上的串口助手,兩個(gè)串口的數據同時(shí)發(fā),在串口助手的界面上把數據給他抓了一下。

然后,我倆對著(zhù)電腦看了一會(huì )兒,各位看官呢,就一會(huì )兒,我們哥倆就懵圈啦!

那么多0x55 0xaa,誰(shuí)知道后面那個(gè)id和數據表示的啥意思呀。面對這樣蒙著(zhù)面紗的數據,誰(shuí)看誰(shuí)懵圈吧!

無(wú)法自證清白的我茫然地看著(zhù)界面里的數據排得密密麻麻,一時(shí)間覺(jué)得無(wú)法招架。側過(guò)頭來(lái),瞥見(jiàn)了小張無(wú)意識中張開(kāi)的大嘴巴,‘真像是一個(gè)大傻瓜’。再轉過(guò)頭來(lái),看了不大會(huì )兒數據又覺(jué)得眼花。

眼花是必然的,因為這里的數據報文本來(lái)就不具備可讀性嘛。

聚成了是一團火,反正它能很好地干活,但是散開(kāi)了則是滿(mǎn)天星,對著(zhù)你一閃一閃亮晶晶,讓你找起問(wèn)題來(lái)火冒金星。

它又如浮萍在水,如淡云在天,只要勁風(fēng)拂來(lái),便是個(gè)萍亂云散的境地。

其實(shí)說(shuō)到底,想自然地解讀這種不具備可讀性的通信協(xié)議是不是有些傻?

荒謬的感覺(jué)越來(lái)越盛,對通信協(xié)議的追問(wèn)也越來(lái)越深入,然后我自然而言地提出了一個(gè)關(guān)鍵性的問(wèn)題:通信協(xié)議可不可以具備可讀性?當然可以,藍牙的應用協(xié)議(profile)不就是可讀的嗎?怎么賦予它可讀性?!

就這樣,一個(gè)呼吸之間,腦海里問(wèn)題剛剛浮現,答案就出現在眼前,猶如天外飛仙。

我突然感到很佩服自己。

禪門(mén)大德開(kāi)導座下弟子時(shí),經(jīng)常說(shuō)一句:‘脫了衣服去!’通信協(xié)議,何嘗不是脫掉了衣服,揭開(kāi)了它的面紗?!

我把從心底瞬間涌上來(lái)的情緒,壓縮成一句話(huà),最終把它一字一頓地說(shuō)了出來(lái):

萬(wàn)物皆有靈,只需喚起它們的靈性。

話(huà)音甫落,小張的嘴巴張得更大了。

在兩個(gè)電子設備之間采用文本式進(jìn)行通信,仿佛它們就脫離了無(wú)情種智,進(jìn)入了有情眾生的世界。

向小張普及了這個(gè)思想之后,我旋即制定了一個(gè)可統一各個(gè)測試項的通信協(xié)議。

上位機發(fā)起測試請求,報文內容為“TestReq XXXrn”,其中的XXX代表具體的測試項,比如要測試信號強度,XXX=RSSI,比如要測試1號繼電器,XXX=RELAY1......

下位機返回測試結果,測試成功時(shí)報文內容為“TestResult XXX OKrn”,測試失敗時(shí)報文內容為“TestResult XXX ERRrn”,這里的XXX就是上述所謂測試項名稱(chēng)。

具體解析時(shí)也很簡(jiǎn)單,先通過(guò)換行符rn把一條獨立的報文提取出來(lái),然后把報文頭“TestReq ”或者“TestResult ”查找出來(lái),然后就定位到了XXX的位置,把它讀取出來(lái)即可。

封裝報文和解析報文也都變得無(wú)比地簡(jiǎn)單,因為C語(yǔ)言有字符串函數支持上面這一系列操作!

這樣一來(lái),在通信鏈路上傳輸的數據都是可讀的,而且報文通過(guò)換行符進(jìn)行間隔,是不是漏發(fā),是不是報文中間的數據發(fā)生了錯誤,都一目了然了。

后來(lái),在通信的幫助下,小張的問(wèn)題也找到了。

原來(lái),測試工裝上位機軟件設計時(shí),對每個(gè)測試條目都加了超時(shí)限制,當它的計算機上打開(kāi)很多軟件時(shí),測試工裝上位機軟件的實(shí)時(shí)性就變差了,有的時(shí)候就自動(dòng)觸發(fā)了超時(shí),標記為測試失敗。

恩,小張這個(gè)設計思路當然有一定的問(wèn)題,但是這不是本文要探究的主題:)


央視主持人大賽里有一期節目,里面有一個(gè)擂臺題目是“做新聞是內容重要還是形式重要”。雙方唇槍舌戰,鼓舌如簧,紛紛站在自己抽簽抽到的立場(chǎng)上引經(jīng)據典,這邊說(shuō)內容重要,那邊說(shuō)形式重要。我當時(shí)看得那個(gè)著(zhù)急啊,這些單純的讀書(shū)人啊,難道你們不知道,內容很重要,形式也很重要嘛!

就像本文討論的通信協(xié)議一樣,采用具有可讀性的文本形式既能很好地滿(mǎn)足雙方交互,又能明明白白地顯示給在一旁監控它運行的工程師,一箭雙雕,豈不美哉!



關(guān)鍵詞: 通信協(xié)議 文本化

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>