zstack较新的版本支持同时使用两个串行口,不过要求一个是DMA方式另一个是ISR方式,具体操作方法如下:
1)首先打开hal_board_cfg.h文件,确定有以下语句:
/* Set to TRUE enable DMA usage, FALSE disable it */
#ifndef HAL_DMA
#define HAL_DMA TRUE
#endif
这段语句定义了编译器编译有关DMA的函数
2)找到workspace中项目名称,点击右键,在弹出的下拉菜单中点击options...
c/c++compiler->preprocessor选项卡,找到define symbols: 查看是否有ZTOOL_P1,如果没有添加一个,OK确定。
3)回到hal_board_cfg.h文件,修改代码如下
#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 2
#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
//==========================================================================
// 串口0初始化函数
//==========================================================================
static void FS_Uart_Init(void)
{
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = 256; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = 70; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = 256; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = 6; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = FS_Uart_CallBack;
HalUARTOpen (HAL_UART_PORT_0, &uartConfig);
}
//==========================================================================
// 串口1初始化函数
//==========================================================================
static void FS_Uart1_Init(void)
{
halUARTCfg_t uartConfig;
uartConfig.configured = TRUE; // 2x30 don't care - see uart driver.
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.flowControl = FALSE;
uartConfig.flowControlThreshold = 32; // 2x30 don't care - see uart driver.
uartConfig.rx.maxBufSize = 32; // 2x30 don't care - see uart driver.
uartConfig.tx.maxBufSize = 32; // 2x30 don't care - see uart driver.
uartConfig.idleTimeout = 6; // 2x30 don't care - see uart driver.
uartConfig.intEnable = TRUE; // 2x30 don't care - see uart driver.
uartConfig.callBackFunc = FS_Uart_CallBack; 指定串口回调函数
HalUARTOpen (HAL_UART_PORT_1, &uartConfig);
}
5)串口函数的读出
从以上初始化代码中很明显的看到,两个port口采用了两个初始化函数但去采用了同一个回调函数,实际上也只能采用这一个回调函数
串口的读出:
//====================================================================
// @brief 串口回调函数
//====================================================================
static void FS_Uart_CallBack(uint8 port,uint8 event)
{
int i ;
//(port == HAL_UART_PORT_0 )&&
if(( event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT ) ) )
{
if(port == HAL_UART_PORT_0)
{
HalUARTRead(HAL_UART_PORT_0, &i8_uart_buf[count], len); //读取串口数据到buf指向的内存
//此处添加数据解析函数
}
else//port == HAL_UART_PORT_1
{
i8_uart1_len = Hal_UART_RxBufLen(HAL_UART_PORT_1); //取出本次接收到的字符长度
HalUARTRead(HAL_UART_PORT_1, i8_uart1_buf, i8_uart1_len);
osal_set_event( GenericApp_TaskID, GENERICAPP_FS_UART1_CALLBACK );
}
}
}
6)串口写入函数更简单了 直接调用系统函数HalUARTWrite(HAL_UART_PORT_0, “12345”, 5);
涂鸦之作,如有错误,请读者告知,众谢!