zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)
一.串口問題
有問題發送郵件至468078841@qq.com
關于串口的一些常識歡迎點擊進入串口中斷
二.協議棧串口需用函數解讀
這部分主要講述串口發送問題在協議棧中
#include "hal_uart.h" #include "MT_UART.h"這兩個文件中封裝著關于串口的API函數
關于串口的日常收發問題我們主要使用以下的幾個函數
(一)在#include "MT_UART.h"函數中
函數名:MT_UartInit
函數作用:MT層初始化串口
函數原型:
(二)函數名:extern void MT_UartRegisterTaskID( uint8 taskID );
函數作用:注冊串口任務
函數原型:
(三)在#include "hal_uart.h"文件中
函數名:extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length );
函數作用:讀取 port 串口 將 length 字節內容讀取到 pBuffer
函數原型:
(四)函數名:extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length );
函數作用:將 length 字節長度的 pBuffer 發送到串口 port
函數原型:
(五)在OSAL.h文件中
函數名:uint8 osal_set_event( uint8 task_id, uint16 event_flag )
函數作用:將 task_id 事件 event_flag 標志位置1這時候就處于待處理事件
函數原型:
三.在協議棧中發送
(1):添加頭文件 :
#include "hal_uart.h" #include "MT_UART.h"在系統事件初始化函數SampleApp_Init中加上串口初始化函數
MT_UartInit(); HalUARTWrite(0,"UART_OPEN_SUFFCESS",sizeof("UART_OPEN_SUFFCESS"));關于串口0 串口1的問題可以看這里串口中斷
這時將代碼燒寫進入2530中,每次重啟,設備都會發送UART_OPEN_SUFFCESS到上位機,關于串口初始化雜亂消息解決方向會在后續出教程解決。
四.將PC端發送的消息回傳PC端.事件監控
在前面一節我們知道了協議棧對于消息的處理是基于事件輪詢模式,但是在初始自帶中只有按鍵和RF等并沒有串口事件,那我們如何添加自己的事件,讓接收到的消息回傳呢
(一).添加頭文件:
#include "hal_uart.h" #include "MT_UART.h"(二)自己定義串口事件
在uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )函數里自帶了一個SAMPLEAPP_SEND_PERIODIC_MSG_EVT事件,我們goto一下,可以看到事件定義為
我們仿照自帶的類型仿寫 在這里我們要介紹一下這里的事件大小是二進制移位然后轉16進制進行表示那我我們的接著就是0x0002 0x0004 等等,在這里我們添加自己的串口事件
#define UART_EVT 0x0002(三).添加自己的初始化函數
在系統事件初始化函數SampleApp_Init中加上串口初始化函數
(四)事件仿寫
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被觸發 我們就進入這里{UART_len = Hal_UART_RxBufLen(0); //先讀取串口0 監測是否有消息if(UART_len) //有消息進入這里{osal_memset(UART_RX,'\0',128); //將UART_RX內容清空HalUARTRead(0,UART_RX,UART_len); //讀取消息HalUARTWrite(0,UART_RX,UART_len);//發送消息UART_len = 0; //清空這次的消息}//定時器執行osal_set_event(task_id,UART_EVT);//再次置1 進行消息監控// return unprocessed eventsreturn (events ^ UART_EVT); //將這次消息事件清空}// Discard unknown eventsreturn 0; }通過上述的操作我們就可以完成常見的串口收發,不過這樣寫有點麻煩,用這種寫過GPRS登錄的云端服務器的操作,很麻煩,要考慮很多東西,還容易被優化了。
五.將PC端發送的消息回傳PC端.串口回調函數
(一).添加頭文件:
#include "hal_uart.h" #include "MT_UART.h"(二)自己仿寫串口初始化函數,這里可以去MT_UartInit();直接復制到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;//定義個串口結構體uartConfig.configured =TRUE;//串口配置為真uartConfig.baudRate =HAL_UART_BR_115200;//波特率為9600uartConfig.flowControl =FALSE;//流控制為假uartConfig.callBackFunc = Uart_Callback_Function ;//串口回調函數,當接受檢測到串口消息,我們就調用這個函數HalUARTOpen(HAL_UART_PORT_0,&uartConfig);// 打開串口0HalUARTWrite(0,"UART_OPEN_SUFFCESS",sizeof("UART_OPEN_SUFFCESS"));}不要忘記聲明函數static void Uart_Callback_Function();
(三)實現串口回調函數
在串口初始化的作用域下,自己隨便找個地方寫
通過上述步驟步驟,算是基本掌握了協議棧的串口問題,在后續將會寫一些關于雙串口調試的問題,有問題也歡迎大家一起討論,后續忙完會陸續出一些其他的內容,歡迎提要求哈!
有問題請發郵件至468078841@qq.com
總結
以上是生活随笔為你收集整理的zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华硕afudos刷bios_华硕M2N-
- 下一篇: ZigBee协议栈的串口实验