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

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、各種初始化函數(shù)”。初始化中我們需要注意的是“osal_init_system();”初始化操作系統(tǒng)函數(shù)。等一下會(huì)對(duì)它進(jìn)行說明。繼續(xù)看下去,“osal_start_system();”這是執(zhí)行操作系統(tǒng)函數(shù),對(duì)應(yīng)流程中的“運(yùn)行操作系統(tǒng)”。注意這個(gè)函數(shù)進(jìn)去之后是不會(huì)再返回的??偨Y(jié)main函數(shù)就是初始化和執(zhí)行操作系統(tǒng)兩個(gè)部分。我們?cè)賮矸治鲆幌隆皁sal_init_system();”這個(gè)函數(shù),它的功能是初始化操作系統(tǒng)。我們gotodefinition看一下這個(gè)函數(shù)的代碼。osal_init_system();瀏覽這個(gè)函數(shù)我們可以看到其中依舊是各種初始化函數(shù)。重點(diǎn)觀察“osalInitTasks();”

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

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

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

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

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

9、MT_UART_DEFAULT_OVERFLOWFALSE這行代碼是打開串口流控的意思。因?yàn)槲覀兇谕ㄓ嵤莾筛€的,必須把它關(guān)閉。2.發(fā)送部分代碼打開SampleApp.c,找到SampleApp事件處理函數(shù)SampleApp_ProcessEvent()。補(bǔ)充一點(diǎn),我們可以在SampleApp下添加自己的事件,每個(gè)事件有自己的事件號(hào)。事件號(hào)是16位的,但是每個(gè)事件號(hào)只允許占16位中的1位,也就是說最多有16個(gè)事件。我們先瀏覽一下代碼,大致功能是分析傳遞進(jìn)來的事件號(hào),觸發(fā)相應(yīng)事件。感覺這個(gè)和任務(wù)號(hào)處理模式還是挺像的。我們需要關(guān)注的是“系統(tǒng)消息事件”被觸發(fā)之后。即 “if(events&SYS_

10、EVENT_MSG)”語句之后的部分。先看第一行:MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID);這一行代碼實(shí)現(xiàn)功能是獲取系統(tǒng)消息數(shù)據(jù)。我們可以自己去查看里面的定義。afIncomingMSGPacket是包含整個(gè)消息內(nèi)容的結(jié)構(gòu)體類型。之后的選擇語句則是根據(jù)消息中的信息對(duì)數(shù)據(jù)進(jìn)行相應(yīng)處理。我們需要關(guān)注如下代碼(圖8)圖8弄了半天,原來還在初始化.意思是網(wǎng)絡(luò)狀態(tài)發(fā)送變化時(shí)(其實(shí)就是打開網(wǎng)絡(luò)),就對(duì)數(shù)據(jù)發(fā)送進(jìn)行初始化??聪逻@三個(gè)參數(shù),第一個(gè)是任務(wù)號(hào),不重復(fù)啦。第二個(gè)是事件號(hào),這個(gè)也說過啦,每個(gè)事件只占1位哦!第三個(gè)

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

12、文我們就可以知道這個(gè)函數(shù)一定就是決定發(fā)送數(shù)據(jù)內(nèi)容的啦。我們需要關(guān)注的是其中第3、4、5個(gè)參數(shù),第3個(gè)參數(shù)的作用是和接收方建立聯(lián)系,這里定義SAMPLEAPP_PERIODIC_CLUSTERID=1,如果協(xié)調(diào)器收到一個(gè)數(shù)據(jù)包,獲取里面的這個(gè)標(biāo)號(hào),為1則證明這個(gè)數(shù)據(jù)包是以周期性廣播方式進(jìn)來的。第4個(gè)參數(shù)表示發(fā)送數(shù)據(jù)的長(zhǎng)度,第5個(gè)參數(shù)為需要發(fā)送的數(shù)據(jù)的指針。進(jìn)行到這里發(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操作說明:我們先看一下這個(gè)條件語句“caseSAMPLEAPP_PERIODIC_CLUSTERID:”。這個(gè)就是在發(fā)送部分設(shè)置的表示周期性發(fā)送數(shù)據(jù)的編號(hào)??窗?,這里就用上了在添加代碼的這個(gè)地方,我們可以對(duì)收到的數(shù)據(jù)進(jìn)行處理(不局限于串口發(fā)送)。這里的三行代碼都是串口發(fā)送的,不再多說什么啦。重點(diǎn)看一下“afIncomingMSGPacket_t*pkt”。所有的數(shù)據(jù)和信息都在函數(shù)傳進(jìn)來的afIncomingMSGPacket里面,查看這個(gè)定義afIncomingMSGPacket_t它是一個(gè)結(jié)構(gòu)體,里面包含了數(shù)據(jù)包的所以內(nèi)容,這里就不說啦,想知道的自己翻譯下注釋吧我們重點(diǎn)關(guān)注其中的afMSGCommandFormat_tcmd。查看它的定義afMSGCommandFormat_t哦哦,這個(gè)里面就有我們傳送的數(shù)據(jù)內(nèi)容啦!其中的DataLength就是數(shù)據(jù)長(zhǎng)度,Data就是數(shù)據(jù)內(nèi)容的指針啦。我們?cè)倏椿厣先?,HalUA

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論