7.串口透?jìng)?打造無線模塊_第1頁(yè)
7.串口透?jìng)?打造無線模塊_第2頁(yè)
7.串口透?jìng)?打造無線模塊_第3頁(yè)
7.串口透?jìng)?打造無線模塊_第4頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、7.串口透?jìng)?打造無線串口模塊前言:串口透?jìng)?,這個(gè)名詞相信大家在看 ZigBee 相關(guān)資料時(shí)候經(jīng)常會(huì)看到,透?jìng)鞯降资鞘裁茨兀侩娔X A 和電腦 B 通過串口相連,相互發(fā)送信息,現(xiàn)在電腦 A 和 B 連接 ZigBee 模塊,再用串口收發(fā)信息,ZigBee 的作用就相當(dāng)于把有線信號(hào)轉(zhuǎn)化成無線信號(hào)。這樣電腦前面操作是一樣的,但是已經(jīng)變成了無線傳輸了,這就是串口透?jìng)鳎D 1 所示:2.4G網(wǎng)蜂Zigbee模塊網(wǎng)蜂Zigbee模塊COMPC1PC2圖 1串口透?jìng)骶W(wǎng)上的價(jià)格這么貴的東西原理又是怎樣呢?一個(gè)呢?網(wǎng)蜂跟你說,完全沒問題。能不能用自己的模塊做實(shí)現(xiàn):WeBee CC2530 模塊及功能底板各兩塊(

2、一個(gè)協(xié)調(diào)器,一個(gè)終端)圖 21實(shí)驗(yàn)現(xiàn)象:兩臺(tái)不同的 PC 機(jī)通過串口連接到網(wǎng)蜂開發(fā)板,打開串口調(diào)試助手,設(shè)置好波特率等參數(shù)。相互收發(fā)信息。沒有 2 臺(tái)電腦的也可以用同一臺(tái)電腦的不同串口進(jìn)行實(shí)驗(yàn)。實(shí)驗(yàn)講解:實(shí)驗(yàn)依然使用熟悉的 SleApp.eww 工程來進(jìn)行。面曾做過串口實(shí)驗(yàn)和數(shù)據(jù)無線傳輸,這次實(shí)驗(yàn)也算是前面 2 個(gè)實(shí)驗(yàn)的一個(gè)結(jié)合。不過協(xié)議棧的串口接收有特定的格式,得了解一下它的傳輸機(jī)制。先要實(shí)現(xiàn)這個(gè)功能的流程:由于 2 臺(tái) PC 機(jī)所帶的模塊地位是相等的,所以兩個(gè)模塊的程序流程也一樣了:1、ZigBee 模塊接收到從 PC 機(jī)發(fā)送信息,然后無線發(fā)送出去2、ZigBee 模塊接收到其它 ZigB

3、ee 模塊發(fā)來的信息,然后發(fā)送給 PC 機(jī)打開Z-stack 目錄ProjectszstackSlesSleApp testCC2530DB里面的SleApp.eww 工程。這次實(shí)驗(yàn)基于協(xié)議棧的;SleApp 來進(jìn)行。圖 3打開工程后,可以看到上一節(jié)說到 workspace 目錄下比較重要的兩個(gè)文件夾,Zmain 和 App。這里主要用到 App,這也是用戶自己添加自己代碼的地方。主要在 SleApp.c 和 SleApp.h 中就可以了。2圖 41、ZigBee 模塊接收到從 PC 機(jī)發(fā)送信息,然后無線發(fā)送出去以前做的都是 CC2530 給 PC 機(jī)串口發(fā)信息,還沒接觸過 PC 機(jī)發(fā)送給CC

4、2530,現(xiàn)在就來完成這個(gè)任務(wù)。其主要代碼在 MT_UART.C 中。我們之前協(xié)議棧串口實(shí)驗(yàn)對(duì)串口初始化時(shí)候已經(jīng)有所了解了。在這個(gè)文件里找到串口初始化函數(shù) void MT_UartInit (),找到下面代碼:#if defined (ZTOOL_P1) | defined (ZTOOL_P2)uartConfig.callBackFunc= MT_UartProsZToolData;#elif defined (ZAPP_P1) | defined (ZAPP_P2)uartConfig.callBackFunc #elseuartConfig.callBackFunc#endif= MT_

5、UartProsZAppData;= NULL;定義了 ZTOOL_P1,故協(xié)議棧數(shù)據(jù)處理的函數(shù)是MT_UartPro解釋。sZToolData,進(jìn)入這個(gè)函數(shù)定義。下邊是對(duì)函數(shù)關(guān)鍵地方的3/* fn* brief*MT_UartProsZToolData| SOP | Data Length|CMD|Data|0-Len|FCS|1|1|21|*Parses the data and determine either is SPI or just simply serial datathen send the dao correct place (MT or APP)param*returnp

6、ort event None- UART port- Eventt causes the callback*/* 這個(gè)函數(shù)很長(zhǎng),具體說來就是把串口發(fā)來的數(shù)據(jù)包進(jìn)行打包,校驗(yàn),生成一個(gè)消息,發(fā)給處理數(shù)據(jù)包的任務(wù)。如果你看過 MT 的文檔,應(yīng)該知道如果用 ZTOOL 通過串口來溝通協(xié)議棧,那么發(fā)過來的串口數(shù)據(jù)具有以下格式:0 xFE,DataLength, CM0, CM1, Data payload, FCS翻譯: 0 xFE:數(shù)據(jù)幀頭DataLength:Datapayload 的數(shù)據(jù)長(zhǎng)度,以字節(jié)計(jì),低字節(jié)CM0:命令低字節(jié);CM1:命令高字節(jié);(ZTOOL現(xiàn)和協(xié)議棧交互)就是通過發(fā)送一系列命

7、令給 MT 實(shí)Data payload:數(shù)據(jù)幀具體的數(shù)據(jù),這個(gè)長(zhǎng)度是可變的,但是要和 DataLength 一致;FCS :校驗(yàn)和,從 DataLength 字節(jié)開始到 Data payload 最后一個(gè)字節(jié)所有字節(jié)的異或按字節(jié)操作;也就是說,如果 PC 機(jī)想通過串口發(fā)送信息給 CC2530,由于是使用默認(rèn)的串口函數(shù),所以您必須按上面的格式發(fā)送,否則 CC2530 是收不到任何東西的,這也是大家在調(diào)試串口接收時(shí)一直打圈的地方。盡管這個(gè)機(jī)制是非常完成的,也能校驗(yàn)串口數(shù)據(jù),但是很明顯,需要的是 CC2530 能直接接收到串口信息,然后一成不變的發(fā)成出去,相信你在聊面加 FE的特定字符吧,而且還要自

8、己計(jì)算的時(shí)候也不希望在每句話前。自己的串口處理函數(shù),是不于是就來個(gè)偷龍轉(zhuǎn)鳳,把改函數(shù)換成是很酷?當(dāng)然,不過前提先要了解自帶的這個(gè)函數(shù)。void MT_UartProsZToolData ( u8 port, u8 event )while (Hal_UART_RxBufLen(port)/*查詢緩沖區(qū)讀信息,也成了這里信息是否接收完的標(biāo)志*/HalUARTRead (port, &ch, 1);4/*一個(gè)一個(gè)地讀,讀完一個(gè)緩沖區(qū)就清 1 個(gè)了,?為什么這樣呢,往下看*/switch (se)/*用上狀態(tài)機(jī)了*/case SOP_SE:if (ch = MT_UART_SOF)/* MT_UAR

9、T_SOF 的值默認(rèn)是 0 xFE,所以數(shù)據(jù)必須 FE 格式開始發(fā)送才能進(jìn)入下一個(gè)狀態(tài),不然里轉(zhuǎn)圈*/在這se = LEN_SE;break;case LEN_SE:LEN_Token = ch; tempDataLen = 0;/* Allocate memory for the data */pMsg=(mtOSALSerialData_t*)osal_msg_allocate(sizeof( mtOSALSerialData_t ) +MT_RPC_FRAME_HDR_SZ + LEN_Token );/* 分配內(nèi)存空間*/if (pMsg) /* 如果分配成功*/* Fill up w

10、hat we can */pMsg-hdr.event = CMD_SERIAL_MSG;/*事件號(hào) CMD_SERIAL_MSG;,很有用*/pMsg-msg = (u8*)(pMsg+1);/*定位數(shù)據(jù)位置*/* Make sure its correct */tmp=MT_UartCalcFCS(u8*)&pMsg-msg0,MT_RPC_FRAME_HDR_SZ + LEN_Token);if (tmp = FSC_Token) /*數(shù)據(jù)校驗(yàn)*/osal_msg_send( App_TaskID, (byte *)pMsg );/*把數(shù)據(jù)包發(fā)送到 OSAL 層,很很重要*/else/*

11、 deallocate the msg */osal_msg_deallocate ( (u8 *)pMsg );5/*清申請(qǐng)的內(nèi)存空間*/* Reset the s se = SOP_Se, send or discard the buffers at this po E; /*狀態(tài)機(jī)一周期完成*/*/簡(jiǎn)單看了一下代碼,串口從 PC 機(jī)接收到信息會(huì)做如下處理:1、接收串口數(shù)據(jù),判斷起始碼是否為 0 xFE2、得到數(shù)據(jù)長(zhǎng)度然后給數(shù)據(jù)包 pMsg 分配內(nèi)存3、給數(shù)據(jù)包 pMsg 裝數(shù)據(jù)4、打包成任務(wù)發(fā)給上層 OSAL 待處理5、數(shù)據(jù)包內(nèi)存要做的是簡(jiǎn)化再簡(jiǎn)化。流程變成:1、接收到數(shù)據(jù)2、判斷長(zhǎng)度然

12、后然后給數(shù)據(jù)包 pMsg 分配內(nèi)存3、打包發(fā)送給上層 OSAL 待處理4、內(nèi)存網(wǎng)蜂獨(dú)家參考程序如下:1.2.3.4.5.void MT_UartProsZToolData ( u8 port, u8 event )u u8 flag=0,i,j=0;8 buf128;/flag 是判斷有沒有收到數(shù)據(jù),j/串口 buffer 最大緩沖默認(rèn)是 128,數(shù)據(jù)長(zhǎng)度這里用 128.(void)event;/entionally unreferenced parameter6.7.8.9.10.11.while (Hal_UART_RxBufLen(port) /檢測(cè)串口數(shù)據(jù)是否接收完成HalUARTRe

13、ad (port,&bufj, 1); j+;flag=1;/把數(shù)據(jù)接收放到 buf 中/字符數(shù)/已經(jīng)從串口接收到信息12.13.14.15.16.17.18.if(flag=1)/已經(jīng)從串口接收到信息/* Allocate memory for the data */分配內(nèi)存空間,為機(jī)構(gòu)體內(nèi)容+數(shù)據(jù)內(nèi)容+1 個(gè)長(zhǎng)度的數(shù)據(jù)pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t )+j+1);/事件號(hào)用原來的 CMD_SERIAL_MSGpMsg-hdr.event = CMD_SERIAL_MSG;

14、619.20.21.22.23.24.25.26.27.pMsg-msg = (u pMsg-msg 0= j; for(i=0;imsg i+1= bufi;osal_msg_send( App_TaskID, (byte *)pMsg );/* deallocate the msg */登記任務(wù),發(fā)往上層osal_msg_deallocate ( (u8 *)pMsg );/內(nèi)存由網(wǎng)蜂提供的代碼可以知道,數(shù)據(jù)包中數(shù)據(jù)部分的格式是:datalen+data到這里,數(shù)據(jù)接收的處理函數(shù)已經(jīng)完成了,接下來要做的就是怎么在任務(wù)中處理這個(gè)包內(nèi)容呢?很簡(jiǎn)單,因?yàn)榇诔跏蓟窃赟leApp 中進(jìn)行的,任務(wù)

15、號(hào)也是 SleApp 的 ID,所以當(dāng)然是在 SleApp.C 里面進(jìn)行了。在 SleApp.C 找到任務(wù)處理函數(shù):u16 SleApp_ProsEvent( u8task_id, u16 events ),加入下面紅色代碼:u16 SleApp_ProsEvent( u8task_id, u16 events )ingMSGPacket_t *MSGpkt;(void)task_id;/entionallyunreferencedparameterif ( events & SYS_EVENT_MSG )MSGpkt(ingMSGPacket_t*)osal_msg_receive( Sle

16、App_TaskID );while ( MSGpkt )switch ( MSGpkt-hdr.event )case CMD_SERIAL_MSG:/串口收到數(shù)據(jù)后由 MT_UART 層傳遞過來的數(shù)據(jù),用網(wǎng)蜂方法接收,編譯時(shí)不定義 MT 相關(guān)內(nèi)容,SleApp_SerialCMD(mtOSALSerialData_t *)MSGpkt);break;解釋:串口收到信息后,事件號(hào) CMD_SERIAL_MSG 就會(huì)被登記,便進(jìn)入 case CMD_SERIAL_MSG:7執(zhí)行SleApp_SerialCMD(mtOSALSerialData_t *)MSGpkt);大家是不是很奇怪怎么在協(xié)議

17、棧里找不到這個(gè)函數(shù),當(dāng)然了,那邊只把他打包了,然后登記任務(wù),這個(gè)包是自己的,想怎么處理當(dāng)然由自己來搞掂。大家應(yīng)該想到這個(gè)函數(shù)應(yīng)該要把信息無線發(fā)送出去吧,想到這個(gè)的話你的悟性還挺高的。下面貼上網(wǎng)蜂的參考代碼,用戶也可以自己完成。1.void SleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)2.3.4.u8 i,len,*str=NULL;/len 有用數(shù)據(jù)長(zhǎng)度/指向數(shù)據(jù)開頭/msg 里的第 1 個(gè)字節(jié)代表后面的數(shù)據(jù)長(zhǎng)度str=cmdMsg-msg; len=*str;5.6.7.8./*打印出串口接收到的數(shù)據(jù),用于提示*/ for(i=1;icluster

18、Id )case_CLUSTERID:/如果是串口透?jìng)鞯男畔en=pkt-cmd.Data0; for(i=0;icmd.Datai+1,1);/發(fā)給 PC 機(jī)HalUARTWrite(0,n,1); break;/ 回車換行10如果想進(jìn)一步節(jié)省資源,可以將函數(shù):u16 SleApp_ProsEvent( u8 task_id, u16 events )里面除了這個(gè)透?jìng)鞯?case 以外的 case 事件判斷都注釋掉。 case CMD_SERIAL_MSG:SleApp_SerialCMD(mtOSALSerialData_t *)MSGpkt);break;最后還要修改預(yù)編譯,注釋掉 MT 層的內(nèi)容。這里注意,選擇了協(xié)調(diào)器、路由器、或者終端編譯時(shí)都要修

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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)論