串口是開發(fā)過程中必不可少的工具,在學習Zigbee應用的過程中也是一樣。正所謂工欲善其事必先利其器科盛,那么在正式學習其他內(nèi)容之前,先在協(xié)議棧中打造自己的串口功能吧2嗽怼(p.s.注意與裸機串口通信的實現(xiàn)方法區(qū)別開來U昝唷)
打開目錄\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB下的SampleApp.eww工程,基于原有協(xié)議棧進行修改。
Step 1 串口初始化
串口初始化無非是配置串口號恍飘、設置波特率榨崩、數(shù)據(jù)位、停止位常侣、校驗位蜡饵、流控等等,一般比較常用的波特率為115200胳施,傳輸模式采用8N1溯祸,即8位數(shù)據(jù)位、無校驗位舞肆、無流控焦辅、1位停止位。那么具體到工程里該怎么配置呢椿胯?
以前需要自己來配置相關(guān)的寄存器筷登,現(xiàn)在協(xié)議棧已經(jīng)完成了相關(guān)寄存器的配置,我們只需要調(diào)用協(xié)議棧已經(jīng)實現(xiàn)的函數(shù)即可完成串口的初始化哩盲。打開Workspace下HAL->Target->CC2530EB->Drivers中的hal_uart.c文件前方,可以發(fā)現(xiàn)與串口操作相關(guān)的函數(shù)狈醉,如串口初始化函數(shù)void HalUARTInit(void)
、串口發(fā)送函數(shù)uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len)
惠险、串口接收函數(shù)uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len)
等等苗傅。
為了進一步簡化操作流程,協(xié)議棧抽象出了一個MT層班巩,用戶可在該層進行串口配置或者調(diào)其他驅(qū)動渣慕。在MT_UART.c中找到void MT_UartInit ()
函數(shù),這就是MT層的串口初始化函數(shù)抱慌。
/***************************************************************************************************
* @fn MT_UartInit
*
* @brief Initialize MT with UART support
*
* @param None
*
* @return None
***************************************************************************************************/
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;//流控制逊桦,若只連接Rx/Tx鞍恢,則需關(guān)閉此選項
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;
#else
uartConfig.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
}
函數(shù)本身已有比較詳細的注釋属百,函數(shù)名以及變量名也很直觀,在此不在贅述篙悯。值得注意的是
1.默認的串口波特率是38400bps单匣,所以需要手動更改為我們需要的115200bps夕凝。在MT_UART_DEFAULT_BAUDRATE上右鍵Go to definition of MT_UART_DEFAULT_BAUDRATE,將宏定義MT_UART_DEFAULT_BAUDRATE的值更改為HAL_UART_BR_115200户秤,即#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200
码秉。
2.需要將默認流控所對應的宏定義MT_UART_DEFAULT_OVERFLOW的值更改為FALSE,即關(guān)閉串口流控鸡号。特別是采用Rx/Tx兩根線的方式進行通信時必須關(guān)閉流控转砖,否則不能發(fā)送信息。
【ò椤3.根據(jù)預編譯府蔗,我們選擇ZTOOL,所以需要在option->C/C++ compiler的Preprocessor里添加ZTOOL_P1預編譯選項(默認已添加)汞窗,如下圖姓赤。
修改好以上內(nèi)容后,就需要在合適的位置調(diào)用
void MT_UartInit ()
函數(shù)來完成串口的初始化仲吏。打開App中的SampleApp.c文件不铆,找到用戶自定義應用初始化函數(shù)SampleApp_Init( uint8 task_id )
,在OSAL分配任務ID裹唆、設置設備初始狀態(tài)以及消息發(fā)送ID后添加串口初始化函數(shù)void MT_UartInit ()
誓斥,見下圖。
因為使用了MT層的函數(shù)许帐,所以不要忘了在SampleApp.c文件的開頭包含頭文件
#include "MT_UART.h"
#include "MT.h"
Step 2 登記任務號
在剛剛添加串口初始化函數(shù)語句的下面添加
MT_UartRegisterTaskID(task_id);//登記任務號劳坑,注冊串口任務
即完成該任務號task_id與串口事件的綁定。
Step 3 通過串口發(fā)送消息
在上述語句后面繼續(xù)添加
HalUARTWrite(0,"UartInit OK!\n",sizeof("UartInit OK!\n"));//串口發(fā)送
至此成畦,代碼修改完成距芬,請看下圖完整版
Step 4 上電調(diào)試
連接仿真器和 USB 轉(zhuǎn)串口線涝开,選擇任意工程(除DemoEB外),點擊下載并調(diào)試蔑穴,全速運行后產(chǎn)看串口收到的信息
從上圖可以看出忠寻,除了我們發(fā)送的UartInit OK!外惧浴,還多出了一些亂碼存和。這是Zstack在MT層定義的串口發(fā)送格式,這些亂碼里面還包含液晶提示信息衷旅。搞清楚原因之后捐腿,對癥下藥,在option->C/C++ compiler的Preprocessor里將與MT和LCD相關(guān)的預編譯選項注釋掉即可柿顶,注釋方法只需要在相應的預編譯選項的前面加上x茄袖,直接看圖吧!
再重新Rebuild All,點擊下載并調(diào)試嘁锯,再次查看串口收到的信息
大功告成宪祥!