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

来源:互联网 发布:手机淘宝直通车在哪里 编辑:程序博客网 时间:2024/06/01 09:29

在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       2000uint8  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;}
原创粉丝点击