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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)

發(fā)布時(shí)間:2024/8/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.串口問(wèn)題

有問(wèn)題發(fā)送郵件至468078841@qq.com

關(guān)于串口的一些常識(shí)歡迎點(diǎn)擊進(jìn)入串口中斷

二.協(xié)議棧串口需用函數(shù)解讀

這部分主要講述串口發(fā)送問(wèn)題在協(xié)議棧中

#include "hal_uart.h" #include "MT_UART.h"

這兩個(gè)文件中封裝著關(guān)于串口的API函數(shù)

關(guān)于串口的日常收發(fā)問(wèn)題我們主要使用以下的幾個(gè)函數(shù)

(一)在#include "MT_UART.h"函數(shù)中
函數(shù)名:MT_UartInit
函數(shù)作用:MT層初始化串口
函數(shù)原型:

void MT_UartInit () {halUARTCfg_t uartConfig;/* Initialize APP ID */App_TaskID = 0;/* UART Configuration */uartConfig.configured = TRUE;//確定配置uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE; //這里是波特率uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;//流控uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;//在RX緩存達(dá)到maxRxBufSize之前還有多少字節(jié)空余。當(dāng)?shù)竭_(dá)maxRxBufSize –flowControlThreshold時(shí)并且流控制打開時(shí),會(huì)觸發(fā)相應(yīng)的應(yīng)用事件:MT_UART_DEFAULT_THRESHOLDuartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;//最大接受字節(jié)uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;//最大發(fā)送字節(jié)uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;//接受數(shù)據(jù)時(shí)間uartConfig.intEnable = TRUE; //使能 #if defined (ZTOOL_P1) || defined (ZTOOL_P2)uartConfig.callBackFunc = MT_UartProcessZToolData; #elif defined (ZAPP_P1) || defined (ZAPP_P2)uartConfig.callBackFunc = MT_UartProcessZAppData; #elseuartConfig.callBackFunc = NULL; //回調(diào)函數(shù) 這個(gè)很有用 #endif/* Start UART */ #if defined (MT_UART_DEFAULT_PORT)HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig); //串口初始化 #else/* Silence IAR compiler warning */(void)uartConfig; #endif/* Initialize for ZApp */ #if defined (ZAPP_P1) || defined (ZAPP_P2)/* Default max bytes that ZAPP can take */MT_UartMaxZAppBufLen = 1;MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY; #endif}

(二)函數(shù)名:extern void MT_UartRegisterTaskID( uint8 taskID );
函數(shù)作用:注冊(cè)串口任務(wù)
函數(shù)原型:

void MT_UartRegisterTaskID( byte taskID ) {App_TaskID = taskID; }

(三)在#include "hal_uart.h"文件中
函數(shù)名:extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length );
函數(shù)作用:讀取 port 串口 將 length 字節(jié)內(nèi)容讀取到 pBuffer
函數(shù)原型:

uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len) {(void)port;(void)buf;(void)len;#if (HAL_UART_DMA == 1)if (port == HAL_UART_PORT_0) return HalUARTReadDMA(buf, len); #endif #if (HAL_UART_DMA == 2)if (port == HAL_UART_PORT_1) return HalUARTReadDMA(buf, len); #endif #if (HAL_UART_ISR == 1)if (port == HAL_UART_PORT_0) return HalUARTReadISR(buf, len); #endif #if (HAL_UART_ISR == 2)if (port == HAL_UART_PORT_1) return HalUARTReadISR(buf, len); #endif#if HAL_UART_USBreturn HalUARTRx(buf, len); #elsereturn 0; #endif }

(四)函數(shù)名:extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length );
函數(shù)作用:將 length 字節(jié)長(zhǎng)度的 pBuffer 發(fā)送到串口 port
函數(shù)原型:

uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) {(void)port;(void)buf;(void)len; , , ,#if (HAL_UART_ISR == 2)if (port == HAL_UART_PORT_1) return HalUARTWriteISR(buf, len);HalUARTTx(buf, len);return len; #elsereturn 0; #endif }

(五)在OSAL.h文件中
函數(shù)名:uint8 osal_set_event( uint8 task_id, uint16 event_flag )
函數(shù)作用:將 task_id 事件 event_flag 標(biāo)志位置1這時(shí)候就處于待處理事件
函數(shù)原型:

uint8 osal_set_event( uint8 task_id, uint16 event_flag ) {if ( task_id < tasksCnt ){halIntState_t intState;HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interruptstasksEvents[task_id] |= event_flag; // Stuff the event bit(s)HAL_EXIT_CRITICAL_SECTION(intState); // Release interruptsreturn ( SUCCESS );}else{return ( INVALID_TASK );} }

三.在協(xié)議棧中發(fā)送

(1):添加頭文件 :

#include "hal_uart.h" #include "MT_UART.h"

在系統(tǒng)事件初始化函數(shù)SampleApp_Init中加上串口初始化函數(shù)

MT_UartInit(); HalUARTWrite(0,"UART_OPEN_SUFFCESS",sizeof("UART_OPEN_SUFFCESS"));

關(guān)于串口0 串口1的問(wèn)題可以看這里串口中斷
這時(shí)將代碼燒寫進(jìn)入2530中,每次重啟,設(shè)備都會(huì)發(fā)送UART_OPEN_SUFFCESS到上位機(jī),關(guān)于串口初始化雜亂消息解決方向會(huì)在后續(xù)出教程解決。

四.將PC端發(fā)送的消息回傳PC端.事件監(jiān)控

在前面一節(jié)我們知道了協(xié)議棧對(duì)于消息的處理是基于事件輪詢模式,但是在初始自帶中只有按鍵和RF等并沒(méi)有串口事件,那我們?nèi)绾翁砑幼约旱氖录?#xff0c;讓接收到的消息回傳呢

(一).添加頭文件:

#include "hal_uart.h" #include "MT_UART.h"

(二)自己定義串口事件
在uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )函數(shù)里自帶了一個(gè)SAMPLEAPP_SEND_PERIODIC_MSG_EVT事件,我們goto一下,可以看到事件定義為

#define SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0x0001

我們仿照自帶的類型仿寫 在這里我們要介紹一下這里的事件大小是二進(jìn)制移位然后轉(zhuǎn)16進(jìn)制進(jìn)行表示那我我們的接著就是0x0002 0x0004 等等,在這里我們添加自己的串口事件

#define UART_EVT 0x0002

(三).添加自己的初始化函數(shù)
在系統(tǒng)事件初始化函數(shù)SampleApp_Init中加上串口初始化函數(shù)

void SampleApp_Init( uint8 task_id ) {SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;.....// Setup for the flash command's destination address - Group 1SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;// Fill out the endpoint description.SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;Samp #endifHalLedSet( HAL_LED_2, HAL_LED_MODE_ON ); MT_UartInit(); //HalUARTWrite(0,"UART_OPEN_SUFFCESS",sizeof("UART_OPEN_SUFFCESS"));MT_UartRegisterTaskID(task_id);//注冊(cè)串口事件osal_set_event(task_id,UART_EVT);//調(diào)用此函數(shù)來(lái)設(shè)置任務(wù)的事件標(biāo)志為1 UART_EVT我們已經(jīng)綁定在串口了 并且在這里啟動(dòng)第一個(gè)串口。 }

(四)事件仿寫

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 ){。。。。。。// Send a message out - This event is generated by a timer// (setup in SampleApp_Init()).if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ){// Send the periodic messageSampleApp_SendPeriodicMessage();// Setup to send message again in normal period (+ a little jitter)osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );// return unprocessed eventsreturn (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);}if ( events & UART_EVT )//如果UART_EVT被觸發(fā) 我們就進(jìn)入這里{UART_len = Hal_UART_RxBufLen(0); //先讀取串口0 監(jiān)測(cè)是否有消息if(UART_len) //有消息進(jìn)入這里{osal_memset(UART_RX,'\0',128); //將UART_RX內(nèi)容清空HalUARTRead(0,UART_RX,UART_len); //讀取消息HalUARTWrite(0,UART_RX,UART_len);//發(fā)送消息UART_len = 0; //清空這次的消息}//定時(shí)器執(zhí)行osal_set_event(task_id,UART_EVT);//再次置1 進(jìn)行消息監(jiān)控// return unprocessed eventsreturn (events ^ UART_EVT); //將這次消息事件清空}// Discard unknown eventsreturn 0; }

通過(guò)上述的操作我們就可以完成常見(jiàn)的串口收發(fā),不過(guò)這樣寫有點(diǎn)麻煩,用這種寫過(guò)GPRS登錄的云端服務(wù)器的操作,很麻煩,要考慮很多東西,還容易被優(yōu)化了。

五.將PC端發(fā)送的消息回傳PC端.串口回調(diào)函數(shù)

(一).添加頭文件:

#include "hal_uart.h" #include "MT_UART.h"

(二)自己仿寫串口初始化函數(shù),這里可以去MT_UartInit();直接復(fù)制到void SampleApp_Init( uint8 task_id )改寫

void SampleApp_Init( uint8 task_id ) {SampleApp_TaskID = task_id;SampleApp_NwkState = DEV_INIT;SampleApp_TransID = 0;.....// Setup for the flash command's destination address - Group 1SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;// Fill out the endpoint description.SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;Samp #endifHalLedSet( HAL_LED_2, HAL_LED_MODE_ON ); halUARTCfg_t uartConfig;//定義個(gè)串口結(jié)構(gòu)體uartConfig.configured =TRUE;//串口配置為真uartConfig.baudRate =HAL_UART_BR_115200;//波特率為9600uartConfig.flowControl =FALSE;//流控制為假uartConfig.callBackFunc = Uart_Callback_Function ;//串口回調(diào)函數(shù),當(dāng)接受檢測(cè)到串口消息,我們就調(diào)用這個(gè)函數(shù)HalUARTOpen(HAL_UART_PORT_0,&uartConfig);// 打開串口0HalUARTWrite(0,"UART_OPEN_SUFFCESS",sizeof("UART_OPEN_SUFFCESS"));}

不要忘記聲明函數(shù)static void Uart_Callback_Function();

(三)實(shí)現(xiàn)串口回調(diào)函數(shù)
在串口初始化的作用域下,自己隨便找個(gè)地方寫

static void Uart_Callback_Function () {UART_len = Hal_UART_RxBufLen(0); //先讀取串口0 長(zhǎng)度if(UART_len) //有消息進(jìn)入這里{osal_memset(UART_RX,'\0',128); //將UART_RX內(nèi)容清空HalUARTRead(0,UART_RX,UART_len); //讀取消息HalUARTWrite(0,UART_RX,UART_len);//發(fā)送消息UART_len = 0; //清空這次的消息}}

通過(guò)上述步驟步驟,算是基本掌握了協(xié)議棧的串口問(wèn)題,在后續(xù)將會(huì)寫一些關(guān)于雙串口調(diào)試的問(wèn)題,有問(wèn)題也歡迎大家一起討論,后續(xù)忙完會(huì)陸續(xù)出一些其他的內(nèi)容,歡迎提要求哈!

有問(wèn)題請(qǐng)發(fā)郵件至468078841@qq.com

總結(jié)

以上是生活随笔為你收集整理的zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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