学习记录 | ZigBee协议栈实践——串口收发数据

上次的理论知识学的有点杂乱

今天来跟着例程实践看一看


目录

一、ZigBee协议栈的安装、编译和下载

二、协议栈工作流程

三、串口通信主要代码

1.串口打印

2.串口打印收到的数据

 四、实现

五、总结


一、ZigBee协议栈的安装、编译和下载

所谓安装协议栈与平常安装应用程序不一样,其实把一些文件解压到某个目录下即为安装完成

如上是开发板公司提供的工程解压后的协议栈目录

Components  存放库的文件夹

Documents  放TI的开发文档的文件夹,里面很多都是讲述协议栈的API

Projects 存放TI协议栈的例程

Tools 放TI例程的一些上位机之类的程序作为工具使用

 带协议栈的工程目录的解释如上,感觉挺有用的,第一次使用协议栈看到这么多文件夹看了这个解释后脑子会比较清晰一些

二、协议栈工作流程

 

 用户添加自己的应用任务程序在Zstack中的调用过程:

main() --->  osal_init_system() ---> osalInitTasks() ---> SampleApp_Init()

int main( void )
{
  // 关闭所有中断
  osal_int_disable( INTS_ALL );

  //初始化系统时钟
  HAL_BOARD_INIT();

  // 检查芯片电压是否正常
  zmain_vdd_check();

  // 初始化I/O LED Timer等
  InitBoard( OB_COLD );

  // 初始化芯片各硬件模块
  HalDriverInit();

  // 初始化Flash存储器
  osal_nv_init( NULL );

  // 初始化MAC层
  ZMacInit();

  // 确定 IEEE 64位地址
  zmain_ext_addr();

#if defined ZCL_KEY_ESTABLISH
  // Initialize the Certicom certificate information.
  zmain_cert_init();
#endif

  // 初始化非易失变量
  zgInit();

#ifndef NONWK
  // Since the AF isn't a task, call it's initialization routine
  afInit();
#endif

  // 初始化操作系统
  osal_init_system();

  // 使能全部中断
  osal_int_enable( INTS_ALL );

  // 最终板载初始化
  InitBoard( OB_READY );

  // 显示设备信息
  zmain_dev_info();

  /* Display the device info on the LCD */
#ifdef LCD_SUPPORTED
  zmain_lcd_init(); //初始化LCD
#endif

#ifdef WDT_IN_PM1
  /* If WDT is used, this is a good place to enable it. */
  WatchDogEnable( WDTIMX );
#endif

  osal_start_system(); // No Return from here 执行操作系统 进去之后不会返回

  return 0;  // Shouldn't get here.
} // main()

三、串口通信主要代码

1.串口打印

    //------------------------配置串口---------------------------------
  MT_UartInit();                    //串口初始化
  MT_UartRegisterTaskID(task_id);   //注册串口任务
  HalUARTWrite(0,"UartInit OK\n", sizeof("UartInit OK\n"));
  //HalUARTWrite(0,"ALD UartInit OK ", sizeof("ALD UartInit OK ")-1);
  //-----------------------------------------------------------------

以上三行代码即可实现串口打印信息 着重再看一看串口初始化 这里我觉得和STM32的串口初始化还挺像的 一定要注意波特率设置

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;
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
  uartConfig.callBackFunc         = MT_UartProcessZAppData;
#else
  uartConfig.callBackFunc         = NULL;
#endif

  /* Start UART */
#if defined (MT_UART_DEFAULT_PORT)
  HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);
#else
  /* Silence IAR compiler warning */
  (void)uartConfig;
#endif

  /* Initialize for ZApp */
#if defined (ZAPP_P1) || defined (ZAPP_P2)
  /* Default max bytes that ZAPP can take */
  MT_UartMaxZAppBufLen  = 1;
  MT_UartZAppRxStatus   = MT_UART_ZAPP_RX_READY;
#endif

}

对了还得提起一个知识点 IAR 和 KEIL 的不同有一点在宏定义

 这里定义的是一些宏定义

 其中ZTOOL_P1 --- 串口0    ZTOOL_P2 --- 串口1 

2.串口打印收到的数据

这里需要自己写一个串口接收回调函数

void rxCB( uint8 port, uint8 event )
{
    unsigned char buf[30];
    unsigned char len;
    
    len = HalUARTRead(0,  buf, 30);//读取串口数据,返回数据长度
    if(len)
    {
        HalUARTWrite(0, buf, len);//通过串口原样返回数据 也可以修改数据返回用于区分数据
        len = 0;
    }
}

 四、实现

 

五、总结

之前在STM32上用串口功能用的比较多,这是第一次用协议栈实现

但其实也是直接使用官方的例程 然后实现并理解 要是自己写肯定也写不来

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值