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

下載本文檔

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

文檔簡介

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

2、傳輸數(shù)據(jù)??上攵渲械拇a數(shù)量是非常龐大的,如果我們每次使用zigbee都需要自己寫所以代碼的話,會非常麻煩。因此就有了協(xié)議棧??梢哉f它是一個小型的操作系統(tǒng),把很多通信、組網(wǎng)之類的代碼都封裝起來了。我們要做的只是通過調(diào)用函數(shù)來實現(xiàn)我們的目的。來看一下協(xié)議棧的工作流程圖(圖1)。然后我會對照流程圖對協(xié)議棧進行簡單的分析。圖1我們就從流程圖的“開始”開始分析吧打開工程文件SampleApp,main函數(shù)是程序執(zhí)行的開始,我們要先找到它。Main函數(shù)在ZMAin文件夾的ZMain.c下,打開它,找到main函數(shù)。main();瀏覽一下main函數(shù)可以看到一開始都是各種初始化函數(shù),即對應流程圖中的“

3、各種初始化函數(shù)”。初始化中我們需要注意的是“osal_init_system();”初始化操作系統(tǒng)函數(shù)。等一下會對它進行說明。繼續(xù)看下去,“osal_start_system();”這是執(zhí)行操作系統(tǒng)函數(shù),對應流程中的“運行操作系統(tǒng)”。注意這個函數(shù)進去之后是不會再返回的。總結(jié)main函數(shù)就是初始化和執(zhí)行操作系統(tǒng)兩個部分。我們再來分析一下“osal_init_system();”這個函數(shù),它的功能是初始化操作系統(tǒng)。我們gotodefinition看一下這個函數(shù)的代碼。osal_init_system();瀏覽這個函數(shù)我們可以看到其中依舊是各種初始化函數(shù)。重點觀察“osalInitTasks();”

4、這個函數(shù),函數(shù)功能是初始化任務系統(tǒng),繼續(xù)gotodefinition,查看該函數(shù)。osalInitTask();通過注釋我們可以知道這個函數(shù)也是拿來初始化的,可以里面的代碼有點難以理解.這里我們需要先知道一點,后面會提到,這里先說明下。額,因為這個是我自己的理解,所以部分描述起來可能不是很專業(yè),能懂這個意思就好了,以后專業(yè)起來了再回來修改.協(xié)議棧采用任務機制,然后使用輪詢的方式處理任務。就是說在空閑的時候它從優(yōu)先級高的任務開始,一個個檢查是否有任務要處理,有則處理這個任務,沒有則繼續(xù)循環(huán)檢測。好嘞就是這樣!那么再來看這個函數(shù),它的作用就是按“任務”的優(yōu)先級給它們發(fā)一個ID號,發(fā)的同時呢又對這個

5、任務進行初始化。需要注意的是任務優(yōu)先級越高,它的ID號越小!然后上面那些我們?nèi)疾挥每紤],需要考慮的是最后兩個函數(shù)(原來我們能操作的優(yōu)先級最低呀.)。嗯.感覺gotodefinition好久了.就不繼續(xù)看下去啦,之后再詳細解讀這兩個函數(shù)吧這樣子初始化的函數(shù)算是解釋完了,我們回到main函數(shù),繼續(xù)看下一個函數(shù)“osal_start_system();”執(zhí)行操作系統(tǒng)函數(shù)!來來來,繼續(xù)gotodefinition找到它本尊。osal_start_system();嗯哼,找到“osal_run_system();”我們繼續(xù).osal_run_system();這里就是我之前說的輪詢的地方啦這里就說下我

6、的理解吧.但是不確定對不對.大致思想應該是對的.先把工作分成兩部分,一部分是任務請求,有任務請求了就把相應標志位置1。另一部分就是我們看到的這個函數(shù)。在函數(shù)開頭讀一下任務請求的寄存器(也許不是寄存器,就那個意思),然后從最高優(yōu)先級依次檢索是不是有任務請求。只要有任務請求,就進入處理任務請求部分(就是“if(idxTarget-CC2530EB-Drivers-hal_uart.c,另一個是MT-MT_UART.c。這兩個文件有什么區(qū)別呢?打開文件研究一下。首先,在MT_UART.c中有include“hal_uart.h”,所以寫頭文件只要寫”MT_UART.h”即可。然后,仔細看代碼,分析h

7、al_uart.c這個文件只要是對不同串口類型的相應操作進行選擇,MT_UART.c這個文件則是對任意串口的操作。就是說MT_UART.c這個文件更底層一點。同樣SampleApp.c文件中,找到函數(shù)voidSampleApp_Init(uint8task_id),在其中加入串口初始化代碼 /*串口初始化*/ MT_UartInit(); /串口初始化 MT_UartRegisterTaskID(task_id); /登記任務號圖4操作說明:串口初始化就不說了。登記任務號就是把串口事件通過task_id登記在SampleApp_Init();中。之前我們有提到說SampleApp_Init()

8、;函數(shù)很重要,就是分配ID號,它還是優(yōu)先級最低的那個。把這個函數(shù)的ID號給串口就是告訴串口我是在這個函數(shù)里面初始化的,相應的我的任務優(yōu)先級是最低的.更改串口初始化配置。在上圖所示的MT_UartInit();處gotodefinition,進入MT_UartInit()函數(shù)(如圖5)。找到其中的MT_UART_DEFAULT_BAUDRATE,gotodefinition后將波特率設置為115200(如圖6)?;氐綀D3位置,找到MT_UART_DEFAULT_OVERFLOW,gotodefinition將參數(shù)設為FALSE(如圖7)。圖5圖6圖7操作說明:修改波特率就不解釋啦。#define

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

10、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ù)進行相應處理。我們需要關注如下代碼(圖8)圖8弄了半天,原來還在初始化.意思是網(wǎng)絡狀態(tài)發(fā)送變化時(其實就是打開網(wǎng)絡),就對數(shù)據(jù)發(fā)送進行初始化。看下這三個參數(shù),第一個是任務號,不重復啦。第二個是事件號,這個也說過啦,每個事件只占1位哦!第三個

11、是設置時間,就是規(guī)定你多久發(fā)一次信息!這里我們預設SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT=5000,這個值可以自行修改,數(shù)值單位是毫秒,就是說這個程序是5秒發(fā)送一次數(shù)據(jù)。設置發(fā)送內(nèi)容,自動周期性發(fā)送。在同一個函數(shù)下找到如下代碼(圖9)圖9如果觸發(fā)周期性數(shù)據(jù)發(fā)送部分(就是說5秒過去了,要發(fā)送信息了),就執(zhí)行SampleApp_SendPeriodicMessage()這個函數(shù)。這個函數(shù)是重點哦,里面放我們需要發(fā)送的數(shù)據(jù)。繼續(xù)gotodefinition.找到該函數(shù)后對該函數(shù)做如下修改(如圖10)。圖10我們來看一下AF_DataRequest()這個函數(shù),通過上下

12、文我們就可以知道這個函數(shù)一定就是決定發(fā)送數(shù)據(jù)內(nèi)容的啦。我們需要關注的是其中第3、4、5個參數(shù),第3個參數(shù)的作用是和接收方建立聯(lián)系,這里定義SAMPLEAPP_PERIODIC_CLUSTERID=1,如果協(xié)調(diào)器收到一個數(shù)據(jù)包,獲取里面的這個標號,為1則證明這個數(shù)據(jù)包是以周期性廣播方式進來的。第4個參數(shù)表示發(fā)送數(shù)據(jù)的長度,第5個參數(shù)為需要發(fā)送的數(shù)據(jù)的指針。進行到這里發(fā)送數(shù)據(jù)部分已經(jīng)結(jié)束啦3.接收部分代碼在SampleApp.c下找到函數(shù)“voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)”,在“caseSAMPLEAPP_PERIODIC_

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

溫馨提示

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

評論

0/150

提交評論