11 在ZStack里实现uart数据输出功能

在ZStack里的uart功能封装在HAL/Include/hal_uart.h头文件里:

#define HAL_UART_BR_9600   0x00
#define HAL_UART_BR_19200  0x01
#define HAL_UART_BR_38400  0x02
#define HAL_UART_BR_57600  0x03
#define HAL_UART_BR_115200 0x04

/* Frame Format constant */

/* Stop Bits */
#define HAL_UART_ONE_STOP_BIT       0x00
#define HAL_UART_TWO_STOP_BITS      0x01

/* Parity settings */
#define HAL_UART_NO_PARITY          0x00
#define HAL_UART_EVEN_PARITY        0x01
#define HAL_UART_ODD_PARITY         0x02

/* Character Size */
#define HAL_UART_8_BITS_PER_CHAR    0x00
#define HAL_UART_9_BITS_PER_CHAR    0x01

/* Flow control */
#define HAL_UART_FLOW_OFF   0x00
#define HAL_UART_FLOW_ON    0x01

/* Ports */
#define HAL_UART_PORT_0   0x00
#define HAL_UART_PORT_1   0x01
#define HAL_UART_PORT_MAX 0x02
...

typedef void (*halUARTCBack_t) (uint8 port, uint8 event);
...
typedef struct
{
  bool                configured;
  uint8               baudRate;
  bool                flowControl;
  uint16              flowControlThreshold;
  uint8               idleTimeout;
  halUARTBufControl_t rx;
  halUARTBufControl_t tx;
  bool                intEnable;
  uint32              rxChRvdTime;
  halUARTCBack_t      callBackFunc;
}halUARTCfg_t;
...

extern void HalUARTInit ( void ); //uart工作模式初始化函数,在系统启动时已调用
extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config );//打开串口,并指定uart的配置参数
extern void HalUARTClose ( uint8 port ); //关闭串口
extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); //接收串口数据
extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); //发出串口数据

extern uint16 Hal_UART_RxBufLen ( uint8 port ); //返回串口port的需要接收的数据长度(接收缓冲区里的数据长度)
extern uint16 Hal_UART_TxBufLen ( uint8 port ); //返回串口port的尚未发出的数据长度(发送缓冲区里的数据长度) 
...

//
串口的使用方法: 只要HalUARTOpen(…)打开串口后,再调用HalUARTRead(…)就可以接收数据, 调用HalUARTWrite(…)就可以发出数据了.
但用不着麻烦了,在工程MT/MT_UART.c里已经实现好由MT任务处理uart的驱动代码:

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; //指定串口接收数据的函数
    ...
#endif

  /* Start UART */
#if defined (MT_UART_DEFAULT_PORT)
  HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig); //打开串口,并指定配置
#else
  /* Silence IAR compiler warning */
  (void)uartConfig;
#endif
...

}
/

void MT_UartRegisterTaskID( byte taskID )
{
  App_TaskID = taskID; //在MT_UART.c里用全局变量App_TaskID存放需要接收串口数据的任务号.
}

void MT_UartProcessZToolData ( uint8 port, uint8 event ) //
{
  uint8  ch;
  uint8  bytesInRxBuffer;

  (void)event;  // Intentionally unreferenced parameter

  while (Hal_UART_RxBufLen(port)) //判断是否已经有数据接收
  {
    HalUARTRead (port, &ch, 1); //接收数据
    ...
  }
  ...
}

//
MT任务的初始化:

void osalInitTasks( void )  //系统初始化所有任务的函数
{
  uint8 taskID = 0;

  ...
#if defined( MT_TASK ) //宏可在工程配置里指定
  MT_TaskInit( taskID++ );
#endif
   ...
  MyApp_Init(taskID);
}

const pTaskEventHandlerFn tasksArr[] = {
  ...
#if defined( MT_TASK )
  MT_ProcessEvent,
#endif
  ...
  MyApp_ProcessEvent,
};

void MT_TaskInit(uint8 task_id)
{
  MT_TaskID = task_id;
   ...
  MT_UartInit(); //串口初始化函数, 我们不需要再次调用此函数了
  ...
}
...
//

要想让MT任务对串口进行操作,需要让宏MT_TASK和宏ZTOOL_P1成立才可以。
在工程里的配置:
这里写图片描述

///
在MyApp任务上加上串口的发出功能:

//注意修改下MT_UartInit里所用的参数
#define MT_UART_DEFAULT_BAUDRATE         HAL_UART_BR_9600
#define MT_UART_DEFAULT_OVERFLOW       FALSE

//////////////////////
// 系统在启动时会自动调用MT_UartInit串口初始化函数,初始化第0个串口.
// HalUARTWrite(HAL_UART_PORT_0, ...) 调用此函数就可以发出数据了

MyApp.c //实现按键时输出字符串

#include "OnBoard.h"
#include "MyApp.h"
#include "hal_led.h"
#include "hal_key.h"
#include "MT_UART.h"
#include "hal_uart.h"
#include "MT.h"


#define TIME_OUT_EVENT 0x4
#define TIME_LEN       2000

uint8  mytask_id; //用于存放本身的任务号


void MyApp_Init(uint8 task_id )
{
   mytask_id = task_id; 

   RegisterForKeys(mytask_id); //设置当前任务接收按键消息

}



uint16 MyApp_ProcessEvent(uint8 task_id, uint16 events )
{
  keyChange_t *key_evt;

  if ( events & SYS_EVENT_MSG ) //当有按键消息时,任务的事件会是SYS_EVENT_MSG
  {
    key_evt = (keyChange_t *)osal_msg_receive(mytask_id);

    if (key_evt->hdr.event == KEY_CHANGE)
    {                
        if (key_evt->keys  &  HAL_KEY_SW_1)
            HalUARTWrite(HAL_UART_PORT_0, "btn1\n\r", 6);

        if (key_evt->keys  &  HAL_KEY_SW_2)
            HalUARTWrite(HAL_UART_PORT_0, "btn2\n\r", 6);
    }

     osal_msg_deallocate( (uint8 *)key_evt ); //回收消息的空间
  }    

  if (events & TIME_OUT_EVENT) //定时器的事件
  {
     ;
  }

  return 0;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值