協(xié)議棧-Z-Stack協(xié)議?;A(chǔ)和數(shù)據(jù)傳輸實驗_第1頁
協(xié)議棧-Z-Stack協(xié)議?;A(chǔ)和數(shù)據(jù)傳輸實驗_第2頁
協(xié)議棧-Z-Stack協(xié)議?;A(chǔ)和數(shù)據(jù)傳輸實驗_第3頁
協(xié)議棧-Z-Stack協(xié)議?;A(chǔ)和數(shù)據(jù)傳輸實驗_第4頁
協(xié)議棧-Z-Stack協(xié)議棧基礎(chǔ)和數(shù)據(jù)傳輸實驗_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、ZigBee模塊協(xié)議棧-Z-Stack協(xié)議棧基礎(chǔ)和數(shù)據(jù)傳輸實驗花了好久寫的.感覺還不錯的呢.如果看,請細(xì)看.MuaZ-Stack協(xié)議?;A(chǔ)和數(shù)據(jù)傳輸實驗一、實驗?zāi)康?#160;   終端節(jié)點將數(shù)據(jù)無線發(fā)送到協(xié)調(diào)器,協(xié)調(diào)器通過串口將數(shù)據(jù)發(fā)送到PC端,并在屏幕上顯示出來。串口優(yōu)化把有線串口傳輸改為無線藍(lán)牙傳輸。 二、實驗平臺硬件:2個zigbee節(jié)點,1個編譯器,1根方口轉(zhuǎn)USB數(shù)據(jù)線,一個藍(lán)牙模塊軟件:實驗基于SampleApp工程進(jìn)行。 三、實驗步驟1. 串口初始化代碼2. 發(fā)送部分代碼3. 接收部分代碼 四、協(xié)議?;A(chǔ)做實驗之前先了

2、解一點關(guān)于協(xié)議棧的基礎(chǔ)知識吧什么是協(xié)議棧?我們知道使用Zigbee一般都要進(jìn)行組網(wǎng)、傳輸數(shù)據(jù)。可想而知其中的代碼數(shù)量是非常龐大的,如果我們每次使用zigbee都需要自己寫所以代碼的話,會非常麻煩。因此就有了協(xié)議棧。可以說它是一個小型的操作系統(tǒng),把很多通信、組網(wǎng)之類的代碼都封裝起來了。我們要做的只是通過調(diào)用函數(shù)來實現(xiàn)我們的目的。來看一下協(xié)議棧的工作流程圖(圖1)。然后我會對照流程圖對協(xié)議棧進(jìn)行簡單的分析。 圖1 我們就從流程圖的“開始”開始分析吧打開工程文件SampleApp,main函數(shù)是程序執(zhí)行的開始,我們要先找到它。Main函數(shù)在ZMAin文件夾的ZMain.c下,打開

3、它,找到main函數(shù)。 main();瀏覽一下main函數(shù)可以看到一開始都是各種初始化函數(shù),即對應(yīng)流程圖中的“各種初始化函數(shù)”。初始化中我們需要注意的是“osal_init_system();”初始化操作系統(tǒng)函數(shù)。等一下會對它進(jìn)行說明。繼續(xù)看下去,“osal_start_system();”這是執(zhí)行操作系統(tǒng)函數(shù),對應(yīng)流程中的“運行操作系統(tǒng)”。注意這個函數(shù)進(jìn)去之后是不會再返回的??偨Y(jié)main函數(shù)就是初始化和執(zhí)行操作系統(tǒng)兩個部分。我們再來分析一下“osal_init_system();”這個函數(shù),它的功能是初始化操作系統(tǒng)。我們go to definition看一下這個

4、函數(shù)的代碼。 osal_init_system();瀏覽這個函數(shù)我們可以看到其中依舊是各種初始化函數(shù)。重點觀察“osalInitTasks();”這個函數(shù),函數(shù)功能是初始化任務(wù)系統(tǒng),繼續(xù)go to definition,查看該函數(shù)。 osalInitTask();通過注釋我們可以知道這個函數(shù)也是拿來初始化的,可以里面的代碼有點難以理解.這里我們需要先知道一點,后面會提到,這里先說明下。額,因為這個是我自己的理解,所以部分描述起來可能不是很專業(yè),能懂這個意思就好了,以后專業(yè)起來了再回來修改.協(xié)議棧采用任務(wù)機(jī)制,然后使用輪詢的方式處理任務(wù)。就是說在空閑的時候

5、它從優(yōu)先級高的任務(wù)開始,一個個檢查是否有任務(wù)要處理,有則處理這個任務(wù),沒有則繼續(xù)循環(huán)檢測。好嘞就是這樣!那么再來看這個函數(shù),它的作用就是按“任務(wù)”的優(yōu)先級給它們發(fā)一個ID號,發(fā)的同時呢又對這個任務(wù)進(jìn)行初始化。需要注意的是任務(wù)優(yōu)先級越高,它的ID號越??!然后上面那些我們?nèi)疾挥每紤],需要考慮的是最后兩個函數(shù)(原來我們能操作的優(yōu)先級最低呀.)。嗯.感覺go to definition好久了.就不繼續(xù)看下去啦,之后再詳細(xì)解讀這兩個函數(shù)吧這樣子初始化的函數(shù)算是解釋完了,我們回到main函數(shù),繼續(xù)看下一個函數(shù)“osal_start_system();”執(zhí)行操作系統(tǒng)函數(shù)!來來來,繼續(xù)g

6、o to definition找到它本尊。 osal_start_system();嗯哼,找到“osal_run_system();”我們繼續(xù). osal_run_system();這里就是我之前說的輪詢的地方啦這里就說下我的理解吧.但是不確定對不對.大致思想應(yīng)該是對的.先把工作分成兩部分,一部分是任務(wù)請求,有任務(wù)請求了就把相應(yīng)標(biāo)志位置1。另一部分就是我們看到的這個函數(shù)。在函數(shù)開頭讀一下任務(wù)請求的寄存器(也許不是寄存器,就那個意思),然后從最高優(yōu)先級依次檢索是不是有任務(wù)請求。只要有任務(wù)請求,就進(jìn)入處理任務(wù)請求部分(就是“if (idx 

7、;< tasksCnt)”這個if語句里面的內(nèi)容),沒有則繼續(xù)循環(huán)。處理任務(wù)請求部分中需要注意兩點:1. 它在把高優(yōu)先級任務(wù)處理完之后會繼續(xù)檢測是否還有任務(wù)請求,直到把使用任務(wù)請求處理完畢。2. 處理完一個任務(wù)之后它會清除該任務(wù)的標(biāo)志位???,不知道你們有沒有看懂.然后這里面的重點函數(shù)呢就是“events = (tasksArridx)( idx, events );”這一句。先看一看tasksArr這個數(shù)組的定義。 pTaskEventHandlerFn tasksArr有沒有發(fā)現(xiàn)它和函數(shù)osalI

8、nitTasks();在同一個文件里面!有沒有發(fā)現(xiàn)它就在osalInitTasks()這個函數(shù)的上面!再仔細(xì)看一看,有沒有發(fā)現(xiàn)它定義成員變量名的順序和下面初始化函數(shù)的順序是一樣的!這樣說估計還是云里霧里的吧.(因為寫到這里我也還是沒有完全懂.)我再說明白點.之前不是說每個任務(wù)都有一個ID號嘛,優(yōu)先級從0開始的,而數(shù)組里面第一位的索引號也是0,就是說任務(wù)ID號和數(shù)組索引號相對應(yīng),那么利用任務(wù)ID號就可以在數(shù)組里面找到相應(yīng)的任務(wù)。還有很神奇的一點,至少我是怎么覺得的.之前看這行代碼感覺非常難以理解.“events = (tasksArridx)( idx, 

9、events ); ”。剛剛想明白的,原來那個數(shù)組的類型是一個函數(shù)!也就是說通過任務(wù)ID找到相應(yīng)進(jìn)行任務(wù)處理的函數(shù)!這樣你們有沒有明白?不懂留言.有人看嗎?笑.終于,協(xié)議棧的分析工作完成了.會不會覺得很亂?看看下面的流程圖再來回顧整理一下吧 圖2 五、實驗過程和說明1. 串口初始化代碼在協(xié)議棧中,用戶自己添加代碼的地方基本為App這個文件夾。打開其中的文件SampleApp.c,在INCLUDES部分添加代碼  #include "MT_UART.h" 圖3操作說明:協(xié)議棧中關(guān)于串口封

10、裝的文件有兩個,一個是HAL->Target->CC2530EB->Drivers->hal_uart.c,另一個是MT->MT_UART.c。這兩個文件有什么區(qū)別呢?打開文件研究一下。首先,在MT_UART.c中有include “hal_uart.h”,所以寫頭文件只要寫”MT_UART.h”即可。然后,仔細(xì)看代碼,分析hal_uart.c這個文件只要是對不同串口類型的相應(yīng)操作進(jìn)行選擇,MT_UART.c這個文件則是對任意串口的操作。就是說MT_UART.c這個文件更底層一點。同樣SampleApp.c文件中,找到函數(shù)void Sample

11、App_Init( uint8 task_id ),在其中加入串口初始化代碼 /*串口初始化*/ MT_UartInit(); /串口初始化 MT_UartRegisterTaskID(task_id); /登記任務(wù)號 圖4操作說明:串口初始化就不說了。登記任務(wù)號就是把串口事件通過task_id登記在SampleApp_Init();中。之前我們有提到說SampleApp_Init();函數(shù)很重要,就是分配ID號,它還是優(yōu)先級最低的那個。把這個函數(shù)的ID號給串口就是告訴串口我是在這個函數(shù)里面初始化的,相應(yīng)的我的任務(wù)優(yōu)先級是最低的.更改串口初始化配置。在上

12、圖所示的MT_UartInit();處go to definition,進(jìn)入MT_UartInit()函數(shù)(如圖5)。找到其中的MT_UART_DEFAULT_BAUDRATE,go to definition后將波特率設(shè)置為115200(如圖6)?;氐綀D3位置,找到MT_UART_DEFAULT_OVERFLOW,go to definition將參數(shù)設(shè)為FALSE(如圖7)。 圖5圖6 圖7操作說明:修改波特率就不解釋啦。#define MT_UART_DEFAULT_OVERFLOW &#

13、160;     FALSE這行代碼是打開串口流控的意思。因為我們串口通訊是兩根線的,必須把它關(guān)閉。 2. 發(fā)送部分代碼打開SampleApp.c,找到SampleApp事件處理函數(shù)SampleApp_ProcessEvent()。補(bǔ)充一點,我們可以在SampleApp下添加自己的事件,每個事件有自己的事件號。事件號是16位的,但是每個事件號只允許占16位中的1位,也就是說最多有16個事件。我們先瀏覽一下代碼,大致功能是分析傳遞進(jìn)來的事件號,觸發(fā)相應(yīng)事件。感覺這個和任務(wù)號處理模式還是挺像的。我們需要關(guān)注的是“系統(tǒng)消息事件”被

14、觸發(fā)之后。即 “if ( events & SYS_EVENT_MSG )”語句之后的部分。先看第一行:MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );這一行代碼實現(xiàn)功能是獲取系統(tǒng)消息數(shù)據(jù)。我們可以自己去查看里面的定義。afIncomingMSGPacket是包含整個消息內(nèi)容的結(jié)構(gòu)體類型。之后的選擇語句則是根據(jù)消息中的信息對數(shù)據(jù)進(jìn)行相應(yīng)處理。我們需要關(guān)注如下代碼(圖8) 圖8弄了半天,

15、原來還在初始化.意思是網(wǎng)絡(luò)狀態(tài)發(fā)送變化時(其實就是打開網(wǎng)絡(luò)),就對數(shù)據(jù)發(fā)送進(jìn)行初始化??聪逻@三個參數(shù),第一個是任務(wù)號,不重復(fù)啦。第二個是事件號,這個也說過啦,每個事件只占1位哦!第三個是設(shè)置時間,就是規(guī)定你多久發(fā)一次信息!這里我們預(yù)設(shè)SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT = 5000,這個值可以自行修改,數(shù)值單位是毫秒,就是說這個程序是5秒發(fā)送一次數(shù)據(jù)。設(shè)置發(fā)送內(nèi)容,自動周期性發(fā)送。在同一個函數(shù)下找到如下代碼(圖9) 圖9如果觸發(fā)周期性數(shù)據(jù)發(fā)送部分(就是說5秒過去了,要發(fā)送信息了),就執(zhí)行SampleApp_SendPeriodi

16、cMessage()這個函數(shù)。這個函數(shù)是重點哦,里面放我們需要發(fā)送的數(shù)據(jù)。繼續(xù)go to definition.找到該函數(shù)后對該函數(shù)做如下修改(如圖10)。 圖10我們來看一下AF_DataRequest()這個函數(shù),通過上下文我們就可以知道這個函數(shù)一定就是決定發(fā)送數(shù)據(jù)內(nèi)容的啦。我們需要關(guān)注的是其中第3、4、5個參數(shù),第3個參數(shù)的作用是和接收方建立聯(lián)系,這里定義SAMPLEAPP_PERIODIC_CLUSTERID=1,如果協(xié)調(diào)器收到一個數(shù)據(jù)包,獲取里面的這個標(biāo)號,為1則證明這個數(shù)據(jù)包是以周期性廣播方式進(jìn)來的。第4個參數(shù)表示發(fā)送數(shù)據(jù)的長度,第5個參數(shù)為需要發(fā)送的

17、數(shù)據(jù)的指針。進(jìn)行到這里發(fā)送數(shù)據(jù)部分已經(jīng)結(jié)束啦 3. 接收部分代碼在SampleApp.c下找到函數(shù)“void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )”,在“case SAMPLEAPP_PERIODIC_CLUSTERID:”下面一行添加代碼(如圖11): HalUARTWrite(0, "I get data!n", 12); HalUARTWrite(0, &pkt->cmd.Data0, pkt->cmd.Data

18、Length); HalUARTWrite(0, "n", 1);圖11 操作說明:我們先看一下這個條件語句“case SAMPLEAPP_PERIODIC_CLUSTERID:”。這個就是在發(fā)送部分設(shè)置的表示周期性發(fā)送數(shù)據(jù)的編號。看吧,這里就用上了在添加代碼的這個地方,我們可以對收到的數(shù)據(jù)進(jìn)行處理(不局限于串口發(fā)送)。這里的三行代碼都是串口發(fā)送的,不再多說什么啦。重點看一下“afIncomingMSGPacket_t *pkt”。所有的數(shù)據(jù)和信息都在函數(shù)傳進(jìn)來的afIncomingMSGPacket里面,查看這個定義 afIncomingMSGPacket_t它是一個結(jié)構(gòu)體,里面包含了數(shù)據(jù)包的所以內(nèi)容,這里就不說啦,想知道的自己翻譯下注釋吧我們重點關(guān)注其中的afMSGCommandFormat_t cmd。查看它的定義 afMSGCommandFormat_t哦哦,這個里面就有我們傳送的數(shù)據(jù)內(nèi)容啦!其中的DataLength就是數(shù)據(jù)長度,Data就是數(shù)據(jù)內(nèi)容的指針啦。我們再看

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論