zstack同时使用两个串行口

zstack同时使用两个串行口的方法

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...

zstack同时使用两个串行口_第1张图片

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

这样就选择了port0 采用DMA方式,port1采用ISR方式。
4)接下来是在应用文件中初始化两个串口。

//==========================================================================
// 串口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);

 

涂鸦之作,如有错误,请读者告知,众谢!

 

你可能感兴趣的:(zstack同时使用两个串行口)