学习记录 | ZigBee协议栈实践——串口收发数据
上次的理論知識學的有點雜亂
今天來跟著例程實踐看一看
目錄
一、ZigBee協議棧的安裝、編譯和下載
二、協議棧工作流程
三、串口通信主要代碼
1.串口打印
2.串口打印收到的數據
?四、實現
五、總結
一、ZigBee協議棧的安裝、編譯和下載
所謂安裝協議棧與平常安裝應用程序不一樣,其實把一些文件解壓到某個目錄下即為安裝完成
如上是開發板公司提供的工程解壓后的協議棧目錄
Components? 存放庫的文件夾
Documents? 放TI的開發文檔的文件夾,里面很多都是講述協議棧的API
Projects 存放TI協議棧的例程
Tools 放TI例程的一些上位機之類的程序作為工具使用
?帶協議棧的工程目錄的解釋如上,感覺挺有用的,第一次使用協議棧看到這么多文件夾看了這個解釋后腦子會比較清晰一些
二、協議棧工作流程
?
?用戶添加自己的應用任務程序在Zstack中的調用過程:
main() --->? osal_init_system() ---> osalInitTasks() ---> SampleApp_Init()
int main( void ) {// 關閉所有中斷osal_int_disable( INTS_ALL );//初始化系統時鐘HAL_BOARD_INIT();// 檢查芯片電壓是否正常zmain_vdd_check();// 初始化I/O LED Timer等InitBoard( OB_COLD );// 初始化芯片各硬件模塊HalDriverInit();// 初始化Flash存儲器osal_nv_init( NULL );// 初始化MAC層ZMacInit();// 確定 IEEE 64位地址zmain_ext_addr();#if defined ZCL_KEY_ESTABLISH// Initialize the Certicom certificate information.zmain_cert_init(); #endif// 初始化非易失變量zgInit();#ifndef NONWK// Since the AF isn't a task, call it's initialization routineafInit(); #endif// 初始化操作系統osal_init_system();// 使能全部中斷osal_int_enable( INTS_ALL );// 最終板載初始化InitBoard( OB_READY );// 顯示設備信息zmain_dev_info();/* Display the device info on the LCD */ #ifdef LCD_SUPPORTEDzmain_lcd_init(); //初始化LCD #endif#ifdef WDT_IN_PM1/* If WDT is used, this is a good place to enable it. */WatchDogEnable( WDTIMX ); #endifosal_start_system(); // No Return from here 執行操作系統 進去之后不會返回return 0; // Shouldn't get here. } // main()三、串口通信主要代碼
1.串口打印
//------------------------配置串口---------------------------------MT_UartInit(); //串口初始化MT_UartRegisterTaskID(task_id); //注冊串口任務HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n"));//HalUARTWrite(0,"ALD UartInit OK ", sizeof("ALD UartInit OK ")-1);//-----------------------------------------------------------------以上三行代碼即可實現串口打印信息 著重再看一看串口初始化 這里我覺得和STM32的串口初始化還挺像的 一定要注意波特率設置
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;uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;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; #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}對了還得提起一個知識點 IAR 和 KEIL 的不同有一點在宏定義
?這里定義的是一些宏定義
?其中ZTOOL_P1 --- 串口0? ? ZTOOL_P2 --- 串口1?
2.串口打印收到的數據
這里需要自己寫一個串口接收回調函數
void rxCB( uint8 port, uint8 event ) {unsigned char buf[30];unsigned char len;len = HalUARTRead(0, buf, 30);//讀取串口數據,返回數據長度if(len){HalUARTWrite(0, buf, len);//通過串口原樣返回數據 也可以修改數據返回用于區分數據len = 0;} }?四、實現
?
五、總結
之前在STM32上用串口功能用的比較多,這是第一次用協議棧實現
但其實也是直接使用官方的例程 然后實現并理解 要是自己寫肯定也寫不來
總結
以上是生活随笔為你收集整理的学习记录 | ZigBee协议栈实践——串口收发数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mega linux教程,MegaRAI
- 下一篇: 算法导论答案汇总