日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zigbee协议栈初使用(四)无线串口透传

發(fā)布時(shí)間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zigbee协议栈初使用(四)无线串口透传 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

zigbee協(xié)議棧初使用(四)無線串口透傳
串口透傳意思是通過Zigbee實(shí)現(xiàn)兩個(gè)PC通訊,兩個(gè)Zigbee模塊地位應(yīng)該是一樣的。
? 在void MT_UartInit(),有代碼如下:
1#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = MT_UartProcessZToolData;
2#elif defined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = MT_UartProcessZAppData;
3#else
uartConfig.callBackFunc = NULL;
4#endif
加粗部分是協(xié)議棧數(shù)據(jù)串口接收處理函數(shù),進(jìn)入函數(shù)定義。
函數(shù)根據(jù)網(wǎng)蜂《zigbee實(shí)戰(zhàn)指南》進(jìn)行了更改,直接刪除原先的用改后的,代碼如下:

/*****************網(wǎng)蜂修改**************************/void MT_UartProcessZToolData ( uint8 port, uint8 event ) {uint8 flag = 0,i,j = 0; //flag判斷有沒有數(shù)據(jù),j記錄數(shù)據(jù)長度uint8 buf[128]; //緩沖128(void)event;while(Hal_UART_RxBufLen(port)) //檢測串口數(shù)據(jù)是否完成{HalUARTRead(port,&buf[j],1);//數(shù)據(jù)接收到bufj++;flag = 1;}if(flag == 1) //有數(shù)據(jù)時(shí){//分配內(nèi)存,結(jié)構(gòu)體+內(nèi)容+長度pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof( mtOSALSerialData_t )+j+1);pMsg->hdr.event = CMD_SERIAL_MSG;pMsg->msg = (uint8*)(pMsg+1); //把數(shù)據(jù)定位到結(jié)構(gòu)體pMsg->msg [0]= j; //記錄數(shù)據(jù)長度for(i=0;i<j;i++)pMsg->msg [i+1]= buf[i];osal_msg_send( App_TaskID, (byte *)pMsg ); // 登記任務(wù)并發(fā)往上層osal_msg_deallocate ( (uint8 *)pMsg ); // 釋放內(nèi)存} }

更改后數(shù)據(jù)串口接收處理流程為:
?1、接收數(shù)據(jù)
?2、判斷長度然后給數(shù)據(jù)包pMsg分配內(nèi)存
?3、打包發(fā)給上層OSAL處理
?4、釋放內(nèi)存
顯然這里得到的數(shù)據(jù)包由 datalen + data組成;
接下來對得到的數(shù)據(jù)包放到任務(wù)中處理,顯然應(yīng)該是在SampleApp.c,找到任務(wù)處理函數(shù)uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )前文中提起過,

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) {afIncomingMSGPacket_t *MSGpkt;(void)task_id; // Intentionally unreferenced parameterif ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){//串口接收數(shù)據(jù)后由MT_USART層傳來數(shù)據(jù),用網(wǎng)蜂方法接收,編譯時(shí)不定義MT相關(guān)內(nèi)容case CMD_SERIAL_MSG:SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);break;

中文備注下是添加部分, SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);為自定義的無線發(fā)送函數(shù),代碼如下:

void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg) //網(wǎng)蜂提供 {uint8 i,len,*str=NULL; //len有用數(shù)據(jù)長度str=cmdMsg->msg; //指向數(shù)據(jù)開頭len=*str; //msg里的第1個(gè)字節(jié)代表后面的數(shù)據(jù)長度/********打印出串口接收到的數(shù)據(jù),用于提示*********/for(i=1;i<=len;i++)HalUARTWrite(0,str+i,1 ); HalUARTWrite(0,"\n",1 );//換行 /*******發(fā)送出去,同無線數(shù)據(jù)傳輸********/if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,SAMPLEAPP_COM_CLUSTERID,//自己定義一個(gè)len+1, // 數(shù)據(jù)長度 str, //數(shù)據(jù)內(nèi)容&SampleApp_TransID, AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ){}else{// Error occurred in request to send.} }

1#define SAMPLEAPP_COM_CLUSTERID 3 ,數(shù)據(jù)包號自己添加
接下來打印函數(shù)

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //接收數(shù)據(jù) {uint8 len,i;switch ( pkt->clusterId ){case SAMPLEAPP_COM_CLUSTERID: //數(shù)據(jù)包IDHalUARTWrite(0, "message:", sizeof("message:")); //提示信息len=pkt->cmd.Data[0];for(i=0;i<len;i++)HalUARTWrite(0,&pkt->cmd.Data[i+1],1);//發(fā)給 PC 機(jī)HalUARTWrite(0,"\n",1); // 回車換行break;} }

最后還要修改預(yù)編譯,注釋掉 MT 層的內(nèi)容。這里注意,選擇了協(xié)調(diào)器、路
由器、或者終端編譯時(shí)都要修改 options 的。
參考如下:
ZIGBEEPRO
NWK_AUTO_POLL(需要自動重連時(shí)加入)
ZTOOL_P1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
分別下載到協(xié)調(diào)器(必須),終端(或路由)。

總結(jié)

以上是生活随笔為你收集整理的zigbee协议栈初使用(四)无线串口透传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。