zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)
一.串口問(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ù)原型:
(二)函數(shù)名:extern void MT_UartRegisterTaskID( uint8 taskID );
函數(shù)作用:注冊(cè)串口任務(wù)
函數(shù)原型:
(三)在#include "hal_uart.h"文件中
函數(shù)名:extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length );
函數(shù)作用:讀取 port 串口 將 length 字節(jié)內(nèi)容讀取到 pBuffer
函數(shù)原型:
(四)函數(shù)名:extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length );
函數(shù)作用:將 length 字節(jié)長(zhǎng)度的 pBuffer 發(fā)送到串口 port
函數(shù)原型:
(五)在OSAL.h文件中
函數(shù)名:uint8 osal_set_event( uint8 task_id, uint16 event_flag )
函數(shù)作用:將 task_id 事件 event_flag 標(biāo)志位置1這時(shí)候就處于待處理事件
函數(shù)原型:
三.在協(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一下,可以看到事件定義為
我們仿照自帶的類型仿寫 在這里我們要介紹一下這里的事件大小是二進(jìn)制移位然后轉(zhuǎn)16進(jìn)制進(jìn)行表示那我我們的接著就是0x0002 0x0004 等等,在這里我們添加自己的串口事件
#define UART_EVT 0x0002(三).添加自己的初始化函數(shù)
在系統(tǒng)事件初始化函數(shù)SampleApp_Init中加上串口初始化函數(shù)
(四)事件仿寫
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è)地方寫
通過(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)題。
- 上一篇: 华硕afudos刷bios_华硕M2N-
- 下一篇: ZigBee协议栈的串口实验