示例程序和2組網(wǎng)實(shí)驗(yàn)7.串口透?jìng)鱛第1頁(yè)
示例程序和2組網(wǎng)實(shí)驗(yàn)7.串口透?jìng)鱛第2頁(yè)
示例程序和2組網(wǎng)實(shí)驗(yàn)7.串口透?jìng)鱛第3頁(yè)
示例程序和2組網(wǎng)實(shí)驗(yàn)7.串口透?jìng)鱛第4頁(yè)
示例程序和2組網(wǎng)實(shí)驗(yàn)7.串口透?jìng)鱛第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

7.串口透?jìng)鲗?shí)驗(yàn)串口透?jìng)?我來(lái)解釋一下,電腦A和電腦B通過(guò)串口相連,相互發(fā)送信息,現(xiàn)在電腦A和B連接ZigBee模塊,再用串口收發(fā)信息,ZigBee的作用就相當(dāng)于把有線信號(hào)串口透?jìng)鳎D1所示:1實(shí)現(xiàn)平臺(tái):WeBeeCC2530模塊及功能底板各兩塊(一個(gè)協(xié)調(diào)器,一個(gè)終端圖實(shí)驗(yàn)現(xiàn)象:PCZigbee實(shí)驗(yàn)講解:實(shí)驗(yàn)依然使用我們熟悉的SampleApp.eww工程來(lái)進(jìn)行。面我們?cè)鲞^(guò)串口實(shí)驗(yàn)和數(shù)據(jù)無(wú)線傳輸,這次實(shí)驗(yàn)也算是前面2個(gè)實(shí)驗(yàn)的一個(gè)結(jié)合。不過(guò)協(xié)議棧的串口接收有1、ZigBeePC2、ZigBeeZigBeePC我們打開(kāi)Z- SampleApp.eww工程。這次實(shí)驗(yàn)我們基于協(xié)議棧的;SampleApp圖打開(kāi)工程后,我們可以看到上一節(jié)說(shuō)到workspace Zmain和App。這里我們主要用到App,這也是用戶自己添加自己代碼的地方。主要在SampleApp.c和SampleApp.h中就可以了。圖1、ZigBeePCCC2530給PC機(jī)串口發(fā)信息,還沒(méi)接觸過(guò)PC機(jī)發(fā)送給CC2530,現(xiàn)在我們就來(lái)完成這個(gè)任務(wù)。MT_UART.C了。我們?cè)谶@個(gè)文件里找到串口初始化函數(shù)voidMT_UartInit(),找到下面代碼:#ifdefined(ZTOOL_P1)|defined(ZTOOL_P2) #elifdefined(ZAPP_P1)|defined(ZAPP_P2) ZTOOL_P1,故MT_UartProcessZToolData,進(jìn)入這個(gè)函數(shù)定義。下邊是對(duì)函數(shù)關(guān)鍵地方的解釋。 *@brief|SOP|Data FCS 0- ParsesthedataanddetermineeitherisSPIorjustsimplyserial thensendthedatatocorrect ce(MTor port-UART -Eventthatcausesthe /*這個(gè)函數(shù)很長(zhǎng),具體說(shuō)來(lái)就是把串口發(fā)來(lái)的數(shù)據(jù)包進(jìn)行打包,校驗(yàn),生成一個(gè)消息,發(fā)MTZTOOL通過(guò)串口來(lái)溝通 DataLength,CM0,CM1,Datapayload, CM1:命令高字節(jié);(ZTOOLMT)Datapayload:數(shù)據(jù)幀具體的數(shù)據(jù),這個(gè)長(zhǎng)度是可變的,但是要和 DataLengthDatapayload也就是說(shuō),如果PC機(jī)想通過(guò)串口發(fā)送信息給CC2530,由于是使用默認(rèn)的串口函數(shù),所以您必須按上面的格式發(fā)送,否則CC2530是收不到任何東西的,這也是我們大家明顯,我們需要的是CC2530能直接接收到串口信息,然后一成不變的發(fā)成出去,相信你在聊QQ的時(shí)候也不希望在每句話前面加FE的特定字符吧,而且還要自己計(jì)算校驗(yàn)碼于是我們就來(lái)個(gè)偷龍轉(zhuǎn)鳳,把改函數(shù)換成我們自己的串口處理函數(shù),是不是很酷?當(dāng) …………while/*查詢緩沖區(qū)讀信息,也成了這里信息是否接收完的標(biāo)志{,/*1*/switch(state),/*用上狀態(tài)機(jī)了{(lán)case開(kāi)始發(fā)送才能進(jìn)入下一個(gè)狀態(tài),不 在ifchMT_UART_SOF)/*MT_UART_SOF0xFE開(kāi)始發(fā)送才能進(jìn)入下一個(gè)狀態(tài),不 在里轉(zhuǎn)圈/*Allocatememoryforthedata /*分配內(nèi)存空間ifpMsg*如果分配成功{/*Fillupwhatwecan CMD_SERIAL_MSG;,很有用*/pMsg->msg=(uint8*)(pMsg+1);/*定位數(shù)據(jù)位置…………/*Makesureit'scorrecttmp=MT_UartCalcFCS((uint8*)&pMsg->msg[0MT_RPC_FRAME_HDR_SZLEN_Token);if(tmp==FSC_Token)/*數(shù)據(jù)校驗(yàn)*/{/*OSAL層,很很重要}{/*deallocatethemsg*/osal_msg_deallocate((uint8*)pMsg);/*清申請(qǐng)的內(nèi)存空間}/*Resetthestatesendordiscardthebuffersatthispoint*/state=SOP_STATE;/*狀態(tài)機(jī)一周期完成*/………1、接收串口數(shù)據(jù),判斷起始碼是否 2pMsg3pMsg4OSAL5、釋放數(shù)據(jù)包內(nèi)存我們要做的是簡(jiǎn)化再簡(jiǎn)化。流程變成1、接收到數(shù)據(jù)2pMsg3OSAL4、釋放內(nèi)參考程序如下{uint8flag=0,i,j=0;//flag是判斷有沒(méi)有收到數(shù)據(jù),juint8 //buffer128 while(Hal_UART_RxBufLen(port))//檢測(cè)串口數(shù)據(jù)是否接收完{HalUARTReadport,&buf[j1);//buf //已經(jīng)從串口接收到信} //已經(jīng)從串口接收到信 /*Allocatememoryforthedata//分配內(nèi)存空間,為機(jī)構(gòu)體內(nèi)容+數(shù)據(jù)內(nèi)容 個(gè)記錄長(zhǎng)度的數(shù) pMsg->msguint8*)(pMsg+1);// //從第二個(gè)開(kāi)始記錄數(shù) //登記任務(wù),發(fā)往/*deallocatethemsg}27.看代碼可以知道,數(shù)據(jù)包中數(shù)據(jù)部分的格式是datalen+到這里,數(shù)據(jù)接收的處理函數(shù)已經(jīng)完成了,接下來(lái)我們要做的就是,怎么在任務(wù)中處理這個(gè)包內(nèi)容呢?很簡(jiǎn)單,因?yàn)榇诔跏蓟窃赟ampleApp中進(jìn)行的,任務(wù)號(hào)也是SampleApp的ID,所以當(dāng)然是在SampleApp.C里面進(jìn)行了。在SampeApp.C找到任務(wù)處理函數(shù):unt16Samplepp_ProcessEvent(unt8task_d,unt16events),加入下面代碼{ ingMSGPacket_t(void)task_id;//Intentionallyunreferencedparameterif(events&SYS_EVENT_MSG{ while(MSGpkt){{,caseCMD_SERIAL_MSG://串口收到數(shù)據(jù)后由MT_UART層傳遞過(guò)來(lái)的數(shù)據(jù)編譯時(shí)不定義MT相關(guān)內(nèi)容,, 號(hào)CMD_SERIAL_MSG就會(huì)被登記,便進(jìn)case執(zhí)行SampleApp_SerialCMD((mtOSALSerialData_t*)MSGpkt);大家是不是很奇怪怎么在協(xié)議棧里找不到這個(gè)函數(shù),當(dāng)然了,我們那邊只把他打包了,然后登記任務(wù),這個(gè)包是我們自己的,想怎么處理當(dāng)然由自己來(lái)搞掂。大家應(yīng)該想到這個(gè)函數(shù)應(yīng)該要把信息無(wú)線發(fā)送出下面貼上參考代碼,用戶也可以自己完成voidSampleApp_SerialCMD(mtOSALSerialData_t{uint8i,len,*str=NULLlenstr=cmdMsg->msg;//指向數(shù)據(jù)開(kāi)len=*str;//msg1/********打印出串口接收到的數(shù)據(jù),用于提示 HalUARTWrite(0,"\n",1 HalUARTWrite(0,"\n",1);//換 /*******發(fā)送出去if(AF_DataRequest(&SampleApp_Periodic_DstAddr,_CLUSTERID,// str,//{}{//Erroroccurredinrequestto}23. 這個(gè)自己定義 ID,用于接收方判別:如下圖到這里,CC2530從串口接收到信息到轉(zhuǎn)發(fā)出去已經(jīng)完成了,我們可以先下載程序Zigbee節(jié)點(diǎn),然后可以看到發(fā)什么都打印出來(lái)提示了。也就CMD_SERIAL_MSG:和voidSampleApp_SerialCMD(mtOSALSerialData_t*cmdMsg5feel圖2、ZigBeeZigBeePCSampleAppcasevoid ingMSGPacket_t*pkt{uint8switch(pkt->clusterId{ HalUARTWrite(0,&pkt->cmd.Data[i+1],1);//發(fā)給PC機(jī)HalUARTWrite(0,"\n",1); //回車換行break;}}如果想進(jìn)一步節(jié)省資源,可以將函數(shù)uint16SampleApp_ProcessEvent(uint8task_id,uint16events)里面除了這個(gè)透?jìng)鞯腸ase以外的case判斷

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論