学习记录 | ZigBee协议栈实践——串口收发数据
上次的理論知識學(xué)的有點(diǎn)雜亂
今天來跟著例程實(shí)踐看一看
目錄
一、ZigBee協(xié)議棧的安裝、編譯和下載
二、協(xié)議棧工作流程
三、串口通信主要代碼
1.串口打印
2.串口打印收到的數(shù)據(jù)
?四、實(shí)現(xiàn)
五、總結(jié)
一、ZigBee協(xié)議棧的安裝、編譯和下載
所謂安裝協(xié)議棧與平常安裝應(yīng)用程序不一樣,其實(shí)把一些文件解壓到某個(gè)目錄下即為安裝完成
如上是開發(fā)板公司提供的工程解壓后的協(xié)議棧目錄
Components? 存放庫的文件夾
Documents? 放TI的開發(fā)文檔的文件夾,里面很多都是講述協(xié)議棧的API
Projects 存放TI協(xié)議棧的例程
Tools 放TI例程的一些上位機(jī)之類的程序作為工具使用
?帶協(xié)議棧的工程目錄的解釋如上,感覺挺有用的,第一次使用協(xié)議棧看到這么多文件夾看了這個(gè)解釋后腦子會(huì)比較清晰一些
二、協(xié)議棧工作流程
?
?用戶添加自己的應(yīng)用任務(wù)程序在Zstack中的調(diào)用過程:
main() --->? osal_init_system() ---> osalInitTasks() ---> SampleApp_Init()
int main( void ) {// 關(guān)閉所有中斷osal_int_disable( INTS_ALL );//初始化系統(tǒng)時(shí)鐘HAL_BOARD_INIT();// 檢查芯片電壓是否正常zmain_vdd_check();// 初始化I/O LED Timer等InitBoard( OB_COLD );// 初始化芯片各硬件模塊HalDriverInit();// 初始化Flash存儲(chǔ)器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// 初始化操作系統(tǒng)osal_init_system();// 使能全部中斷osal_int_enable( INTS_ALL );// 最終板載初始化InitBoard( OB_READY );// 顯示設(shè)備信息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 執(zhí)行操作系統(tǒng) 進(jìn)去之后不會(huì)返回return 0; // Shouldn't get here. } // main()三、串口通信主要代碼
1.串口打印
//------------------------配置串口---------------------------------MT_UartInit(); //串口初始化MT_UartRegisterTaskID(task_id); //注冊串口任務(wù)HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n"));//HalUARTWrite(0,"ALD UartInit OK ", sizeof("ALD UartInit OK ")-1);//-----------------------------------------------------------------以上三行代碼即可實(shí)現(xiàn)串口打印信息 著重再看一看串口初始化 這里我覺得和STM32的串口初始化還挺像的 一定要注意波特率設(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;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}對了還得提起一個(gè)知識點(diǎn) IAR 和 KEIL 的不同有一點(diǎn)在宏定義
?這里定義的是一些宏定義
?其中ZTOOL_P1 --- 串口0? ? ZTOOL_P2 --- 串口1?
2.串口打印收到的數(shù)據(jù)
這里需要自己寫一個(gè)串口接收回調(diào)函數(shù)
void rxCB( uint8 port, uint8 event ) {unsigned char buf[30];unsigned char len;len = HalUARTRead(0, buf, 30);//讀取串口數(shù)據(jù),返回?cái)?shù)據(jù)長度if(len){HalUARTWrite(0, buf, len);//通過串口原樣返回?cái)?shù)據(jù) 也可以修改數(shù)據(jù)返回用于區(qū)分?jǐn)?shù)據(jù)len = 0;} }?四、實(shí)現(xiàn)
?
五、總結(jié)
之前在STM32上用串口功能用的比較多,這是第一次用協(xié)議棧實(shí)現(xiàn)
但其實(shí)也是直接使用官方的例程 然后實(shí)現(xiàn)并理解 要是自己寫肯定也寫不來
總結(jié)
以上是生活随笔為你收集整理的学习记录 | ZigBee协议栈实践——串口收发数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mega linux教程,MegaRAI
- 下一篇: 算法导论答案汇总