目的借助于協(xié)議検舅穑快速搭建自己的串口接收寿弱。
前期的初始化和《協(xié)議棧中串口實(shí)驗(yàn)之串口發(fā)送》實(shí)驗(yàn)是相同的犯眠,簡(jiǎn)要回顧一下:
一、在SampleApp.c文件添加所需頭文件:
/* MT */
#include "MT.h"
#include "MT_UART.h"
二脖捻、在SampleApp_Init()
函數(shù)中調(diào)用MT_UartInit()
和MT_UartRegisterTaskID(task_id)
兩個(gè)函數(shù)函數(shù)后就可以調(diào)用HalUARTWrite()
函數(shù)進(jìn)行串口打印了:
SampleApp_TaskID = task_id;
SampleApp_NwkState = DEV_INIT;
SampleApp_TransID = 0;
// Device hardware initialization can be added here or in main() (Zmain.c).
// If the hardware is application specific - add it here.
// If the hardware is other parts of the device add it in main().
MT_UartInit();//串口初始化
MT_UartRegisterTaskID(task_id);//登記串口任務(wù)號(hào)
HalUARTWrite(0,"UartInit OK!\n",13);//打印字符串
【注意】記得修改串口初始化函數(shù)`MT_UartInit()`中的波特率阔逼,關(guān)閉流控制,同時(shí)取消project-->options-->C/C++ Compiler-->Preprocessor中關(guān)于MT和LCD的預(yù)編譯選項(xiàng):
-----------------------我是分割線-------------------------------
下面來實(shí)現(xiàn)協(xié)議棧中的串口接收地沮。
讓我們先回到串口初始化函數(shù)
MT_UartInit()
嗜浮。右鍵然后Go to the definition of MT_UartInit查看該函數(shù)的實(shí)現(xiàn)。
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;
#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
}
注意這兩行代碼:
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = MT_UartProcessZToolData;
在預(yù)編譯選項(xiàng)中我們選擇了ZTOOL_P1摩疑,MT_UartProcessZToolData這個(gè)就是串口接收的回調(diào)處理函數(shù)危融。也就是說,當(dāng)配置好協(xié)議棧的串口后雷袋,串口的接收和發(fā)送就已經(jīng)可以用了吉殃。但因?yàn)閰f(xié)議棧的串口接收函數(shù)對(duì)串口進(jìn)行了打包,必須按照固定的格式發(fā)送才可以楷怒。為了更快的實(shí)現(xiàn)自己的串口接收蛋勺,自己寫一個(gè)串口接收的回調(diào)函數(shù)代替MT_UartProcessZToolData()
函數(shù)。
自定義串口接收函數(shù)如下:
void rxCB( uint8 port, uint8 event )
{
unsigned char Uartbuf[20];
unsigned char buflen;
buflen = HalUARTRead(0,Uartbuf,10);//讀取串口數(shù)據(jù)鸠删,返回?cái)?shù)據(jù)長(zhǎng)度
if(buflen)
{
HalUARTWrite(0,Uartbuf,buflen);//打印串口數(shù)據(jù)
buflen = 0;
}
}
這個(gè)函數(shù)實(shí)現(xiàn)了簡(jiǎn)單的回顯功能抱完。將回調(diào)函數(shù)替換為自己的函數(shù)
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = rxCB;
記得在MT_UART.c文件的開頭添加函數(shù)的聲明
void rxCB( uint8 port, uint8 event );
實(shí)驗(yàn)結(jié)果如下: