您的位置:首页 > 其它

开启ZIGBEE中双串口的方法

2015-12-09 19:07 141 查看

通过修改Zstack使UART0和UART1同时工作

zigbee协议中是默认UART0开启并关闭UART1的,我所做的项目协调器必须要两个串口,在查找了一部分资料后,实现了开启双串口的方法。


打开工程中的option选项,配置C/C++ Compiler中的prepocessor的预定义加入:

Hal_UART_ISR=2
HAL_UART_DMA=1


因为在hal_board_cfg.h中默认是DMA优先于ISR:

#if HAL_UART
// Always prefer to use DMA over ISR.
#if HAL_DMA
#ifndef HAL_UART_DMA
#if (defined ZAPP_P1) || (defined ZTOOL_P1)
#define HAL_UART_DMA  1
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_DMA  2
#else
#define HAL_UART_DMA  1
#endif
#endif
#define HAL_UART_ISR  0
#else
#ifndef HAL_UART_ISR
#if (defined ZAPP_P1) || (defined ZTOOL_P1)
#define HAL_UART_ISR  1
#elif (defined ZAPP_P2) || (defined ZTOOL_P2)
#define HAL_UART_ISR  2
#else
#define HAL_UART_ISR  1
#endif
#endif
#define HAL_UART_DMA  0
#endif
这段代码大致的意思是只能开启一个,不用管,将第一个HAL_UART_ISR=0改成HAL_UART_ISR=2,这样就使得DMA为1,ISR为2。


在SerialApp里面加入串口的配置:

halUARTCfg_t uartConfig;
uartConfig.configured           = TRUE;
uartConfig.baudRate             = SERIAL_APP_BAUD;
uartConfig.flowControl          = FALSE;
uartConfig.flowControlThreshold = SERIAL_APP_THRESH;
uartConfig.rx.maxBufSize        = SERIAL_APP_RX_SZ;
uartConfig.tx.maxBufSize        = SERIAL_APP_TX_SZ;
uartConfig.idleTimeout          = SERIAL_APP_IDLE;
uartConfig.intEnable            = TRUE;
uartConfig.callBackFunc         = SerialApp_CallBack;


SERIAL_APP_BAUD代表的是波特率,重点关注SerialApp_CallBack,因为串口的数据通过回掉函数来处理,先写UART0的回掉函数,功能是打印来自PC的数据:

static void UART0_CallBack(uint8 port, uint8 event)
{
(void)port;
uint8  SerialApp_RxBuf[8];
if ((event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)) &&!SerialApp_TxLen)
{
if(!SerialApp_TxLen)
HalUARTRead(HAL_UART_PORT_0,SerialApp_RxBuf, 8);//数据流8
HalUARTWrite(HAL_UART_PORT_0,SerialApp_RxBuf, 8);//打印发来的数据
SerialApp_TxLen=0;
}
}


同理修改HalUARTRead和HalUARTWrite中的参数得到相同功能的UART1回掉函数。

这时在配置后面加入:

uartConfig.callBackFunc         = UART0_CallBack;
HalUARTOpen (UART0, &uartConfig);           //配置UART0
uartConfig.callBackFunc         = UART1_CallBack;
HalUARTOpen (UART1, &uartConfig);//配置UART1


其实这又一点省,其实不怕麻烦的话可以将UART0和UART1的参数调成不一样的。 <-.->

以上就配置好了,原因以后慢慢分析一下,双串口打印可这样写:

HalUARTWrite(UART0, "Init0", 5);
HalUARTWrite(UART1, "Init1", 5);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: