ZigBee笔记(1) ZStack+IAR 任务的创建、串口编程

ZStack+IAR 任务的创建、串口编程

1.任务的创建

1.更改模板工程

  • 更改一下两个目录内的文件名称为你自己的工程名称

在这里插入图片描述
image-20200928111905761

  • 在以下文件中,将所有的的 GenericApp换成你的工程名称,将所有的GENERICAPP替换成你的工程名称的大写

image-20200928112639149

2.创建自己的任务

1.创建文件并添加到工程中
  • 创建自己的.c.h文件,然后添加到工程中

2.编写文件
  • .h文件

    #ifndef __MYMINITASK_H__
    #define __MYMINITASK_H__
    #include "ZComDef.h"
    #define EVENT_FLAG_TIMEOUT (1<<0)
    #define TIMEOUTVALUE 1000
    extern void MyMiniTaskInit(byte taskId);
    extern UINT16 MyMiniTaskProssEvent(byte taskId, UINT16 events);
    #endif
    
  • .c文件

    #include "MyMiniTask.h"
    #include "OSAL.h"
    #include "ZComDef.h"
    #include "hal_uart.h"
    #include "stdio.h"
    
    byte myMiniTaskId;
    static void MyMiniTaskSerialCallBack(uint8 portNumber, uint8 events);
    static bool isTimerRunning = TRUE;
    
    void MyMiniTaskInit(byte taskId)
    {
      halUARTCfg_t uartCfg;
      //根据大课讲义添加代码对uartCfg进行初始化:波特率115200,没有流控,指定串口接收回调MyMiniTaskSerialCallBack
      uartCfg.baudRate = HAL_UART_BR_115200;
      uartCfg.flowControl = false;
      uartCfg.callBackFunc = MyMiniTaskSerialCallBack;
    
      myMiniTaskId = taskId;
      if (HalUARTOpen(0, &uartCfg) == ZSUCCESS)
      {
    
        HalUARTWrite(0, "Uart0 is opened\r\n", osal_strlen("Uart0 is opened\r\n"));
    
        if (ZSUCCESS == osal_start_timerEx(taskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE))
        { //添加启动定时器:溢出时的事件标志为EVENT_FLAG_TIMEOUT,定时时间间隔为TIMEOUTVALUE,已在任务的头文件中定义
          char buffer[100];
          sprintf(buffer,
                  "A timer(EVENT_FLAG=0x%x,Time out value=%dms) is started!\r\n",
                  EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);
          //添加串口发送语句:向串口0发送buffer中的内容
        }
      }
    }
    
    UINT16 MyMiniTaskProssEvent(byte taskId, UINT16 events)
    {
      (void)taskId;
      if (events & EVENT_FLAG_TIMEOUT)
      { //添加表达式判断是否发生了定时器溢出
        HalUARTWrite(0, "Hello,world\r\n", osal_strlen("Hello,world\r\n"));
        if (TRUE == isTimerRunning)
          osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);
        else
          HalUARTWrite(0, "Timer is stoped!\r\n",
                       osal_strlen("Timer is stoped!\r\n"));
        return events ^ EVENT_FLAG_TIMEOUT;
      }
      return 0;
    }
    
    void MyMiniTaskSerialCallBack(uint8 portNumber, uint8 events)
    {
      if (portNumber == 0)
      {
        if ((events & HAL_UART_RX_TIMEOUT) || (events & HAL_UART_RX_ABOUT_FULL) ||
            (events & HAL_UART_RX_FULL))
        {
          char buffer[51];
          char count = HalUARTRead(0, buffer, 51);
          ; //添加读串口的代码
          if (count > 0)
          {
            if (buffer[0] == 0)
              isTimerRunning = FALSE;
            else
            {
              isTimerRunning = TRUE;
              osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);
            }
          }
        }
      }
    }
    
3.将初始化函数和事件放到OSAL文件中
  1. 添加头文件

    #include "ZComDef.h"
    #include "hal_drivers.h"
    #include "OSAL.h"
    #include "OSAL_Tasks.h"
    #include "MyMiniTask.h"//自己定义的.h文件
    #if defined ( MT_TASK )
    
  2. 添加事件函数

    // The order in this table must be identical to the task initialization calls below in osalInitTask.
    const pTaskEventHandlerFn tasksArr[] = {
      macEventLoop,
      nwk_event_loop,
      Hal_ProcessEvent,
      MyMiniTaskProssEvent,//自己定义的事件处理函数
    #if defined( MT_TASK )
    
  3. 初始化函数

    void osalInitTasks( void )
    {
      uint8 taskID = 0;
    
      tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
      osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
    
      macTaskInit( taskID++ );
      nwk_init( taskID++ );
      Hal_Init( taskID++ );
      MyMiniTaskInit(taskID++);//自己定义的初始化函数
    #if defined( MT_TASK )
    

2.串口编程

  1. 初始化函数

    • 初始化串口
    halUARTCfg_t uartCfg;                            //串口配置变量
    uartCfg.baudRate = HAL_UART_BR_115200;           //波特率设置为115200
    uartCfg.flowControl = false;                     //关闭控制流
    uartCfg.callBackFunc = MyMiniTaskSerialCallBack; //回调函数,用于接收数据
    HalUARTOpen(0, &uartCfg);						 //打开串口0
    
    osal_start_timerEx(taskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE)//开启定时器
    
    // 初始化函数
    void MyMiniTaskInit(byte taskId)
    {
      myMiniTaskId = taskId;
      halUARTCfg_t uartCfg;                            //串口配置变量
      uartCfg.baudRate = HAL_UART_BR_115200;           //波特率设置为115200
      uartCfg.flowControl = false;                     //关闭控制流
      uartCfg.callBackFunc = MyMiniTaskSerialCallBack; //回调函数,用于接收数据
      if (HalUARTOpen(0, &uartCfg) == ZSUCCESS)
      {
        HalUARTWrite(0, "Uart0 is opened\r\n", osal_strlen("Uart0 is opened\r\n"));//往串口中输出
        if (ZSUCCESS == osal_start_timerEx(taskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE))
        { //添加启动定时器:溢出时的事件标志为EVENT_FLAG_TIMEOUT,定时时间间隔为TIMEOUTVALUE,已在任务的头文件中定义
          char buffer[100];
          // 如果定时器开启成功,就执行以下
          sprintf(buffer,
                  "A timer(EVENT_FLAG=0x%x,Time out value=%dms) is started!\r\n",
                  EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);
        }
      }
    }
    
  2. 事件处理函数

    // 事件处理函数
    UINT16 MyMiniTaskProssEvent(byte taskId, UINT16 events)
    {
      (void)taskId;
      if (events & EVENT_FLAG_TIMEOUT)// 判断是否溢出
      {
        osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);//重新开启定时器
        return events ^ EVENT_FLAG_TIMEOUT;
      }
      return 0;
    }
    
  3. 串口回调函数

    // 串口回调函数
    void MyMiniTaskSerialCallBack(uint8 portNumber, uint8 events)
    {
      if (portNumber == 0)
      {
        if ((events & HAL_UART_RX_TIMEOUT) || (events & HAL_UART_RX_ABOUT_FULL) ||
            (events & HAL_UART_RX_FULL))
        {
          char buffer[51];
          char count = HalUARTRead(0, buffer, 51);
           //添加读串口的代码
          if (count > 0)
          {
            if (buffer[0] == 0)
              isTimerRunning = FALSE;//定时器设置为关闭,在下一个定时器的时候不会再重新启动了
            else
            {
              isTimerRunning = TRUE;
              osal_start_timerEx(myMiniTaskId, EVENT_FLAG_TIMEOUT, TIMEOUTVALUE);//重新开启定时器
            }
          }
        }
      }
    

3.注意事项

  1. 下载了跟没下一样,要选择Texas Instruments

    image-20200928113150417

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值