基于ZigBee光照感应系统之配置串口函数(2)

上篇博客介绍了系统的大概流程,接下来就介绍节点直接怎样和pc进行通信。
协议栈配置串口通信
我们要实现的效果是pc端可以和节点之间进行串口通信而且不能出现乱码,要实现这些效果就要对协议栈进行一些相关的配置。
首先,在hal_board_cfg.h文件HAL_UART_DMA赋值为0,HAL_UART_ISR赋值为1,让协议栈可以进入串口子程序函数。

void HalUARTInit(void)
{
#if HAL_UART_DMA
  HalUARTInitDMA();
#endif
#if HAL_UART_ISR
  /*
  配优先级
  选择UART0的位置为位置1即P0
  P0功能选择
  模拟IO禁止
  USART模式选择UART
  */
  HalUARTInitISR();
#endif
#if HAL_UART_USB
  HalUARTInitUSB();
#endif
}
#define HAL_UART_DMA  0
#endif
#else
#define HAL_UART_DMA  0

第二步,为了让串口助手不出现乱码,注释掉MT开头的函数以及xLCD_SUPPORTED=DEBUG函数。

在这里插入图片描述
第三步,因为我们注释掉了MT函数,而串口助手有MT_UartInit()、MT_UartRegisterTaskID(task_id)两个必不可少的函数,所以我们把这两个函数放到应用层初始化中去:在SampleApp.c文件void SampleApp_Init( uint8 task_id )函数中添加MT_UartInit()MT_UartRegisterTaskID(task_id)函数

void SampleApp_Init( uint8 task_id )
{
  SampleApp_TaskID = task_id;
  SampleApp_NwkState = DEV_INIT;
  SampleApp_TransID = 0;

   /* Initialize the Serial port */
  //串口配置
  MT_UartInit(); 

  /* Register taskID - Do this after UartInit() because it will reset the taskID */
  MT_UartRegisterTaskID(task_id);

第四步,在SampleApp.c文件添加MT_UART.h、MT.头文件

#include “MT_UART.h”
#include “ MT.h”

第五步,在MT_UART.c文件替换原来的void MT_UartProcessZToolData ( uint8 port, uint8 event )函数,在这里为什么要替换掉void MT_UartProcessZToolData呢?因为ti公司提供的 MT_UartProcessZToolData函数逻辑太复杂了本小白有点看不懂,所以就找了便于理解而且同样可以实现相同功能的函数,我替换掉的函数如下。

void MT_UartProcessZToolData ( uint8 port, uint8 event )
{
  uint8 flag=0,i,j=0;   //flag是判断有没有收到数据,j记录数据长度
  uint8 buf[128];     //串口buffer最大缓冲默认是128,我们这里用128.
  (void)event;        // Intentionally unreferenced parameter  

  while (Hal_UART_RxBufLen(port)) //检测串口数据是否接收完成

  {
    HalUARTRead (port,&buf[j], 1);  //把数据接收放到buf中
    j++;                           //记录字符数
    flag=1;                         //已经从串口接收到信息
  } 

  if(flag==1)       //已经从串口接收到信息

  {     /* Allocate memory for the data */
	    //分配内存空间,为机构体内容+数据内容+1个记录长度的数据
   pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof  
          ( mtOSALSerialData_t )+j+1);
  //事件号用原来的CMD_SERIAL_MSG
  pMsg->hdr.event = CMD_SERIAL_MSG;
  pMsg->msg = (uint8*)(pMsg+1);  // 把数据定位到结构体数据部分
  pMsg->msg [0]= j;              //给上层的数据第一个是长度
  for(i=0;i<j;i++)                //从第二个开始记录数据 
  pMsg->msg [i+1]= buf[i];   
  
  /*在第7步里的语句MT_UartRegisterTaskID(task_id)中
  App_TaskID被赋了应用层的任务号SampleApp_TaskID,所以消息是发往应用层的*/
  osal_msg_send( App_TaskID, (byte *)pMsg ); 
  
                                     
/* deallocate the msg */
  osal_msg_deallocate ( (uint8 *)pMsg );      //释放内存
  }
}

第六步,在S ampleApp.c文件到应用层的事件处理函数SampleApp_ProcessEven增加
case CMD_SERIAL_MSG:
SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);
break;

  case CMD_SERIAL_MSG: //串口事件
                               
           SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);
           break;

*最后,在SampleApp.c文件底部添加void SampleApp_SerialCMD(mtOSALSerialData_t cmdMsg)函数,我们在SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)编写打印函数,就可以在串口助手上看到效果了
最后的最后别忘了添加SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)函数的声明,不然不能执行这个函数。

最后说明一下,这个方法是我在协议栈用来配置串口函数的,也有不同的方法

### 设计基于Zigbee协议的智能窗帘系统 #### 方案概述 为了构建一个高效的智能窗帘控制系统,采用Zigbee作为主要通信协议能够确保低功耗以及稳定的网络性能[^2]。该系统允许用户通过手机应用程序或其他联网设备来远程操作窗帘开合状态。 #### 组件选择 1. **协调器节点** 协调器负责建立并管理整个Zigbee网络,在本项目中可以选择集成了Wi-Fi/Zigbee双模芯片的产品以便于接入互联网,从而实现远程控制功能。 2. **路由器节点 (可选)** 如果覆盖范围较大或者存在信号遮挡,则可以部署额外的路由节点增强通讯质量,保证数据传输稳定可靠。 3. **终端节点 - 窗帘控制器** 使用带有电机驱动电路板的小型微控制器单元(MCU),如STM32系列单片机,配合步进马达完成物理动作执行部分的工作。同时安装光敏电阻等环境感知元件用于检测光照强度变化自动调整窗帘位置[^3]。 4. **电源供应** 考虑到长期运行的需求,建议选用适配器供电方式给各个模块持续提供电力支持;对于移动不便的位置也可以考虑内置锂电池加上充电保护机制的设计方案。 5. **开发工具与软件库** 开发过程中需要用到专业的IDE(集成开发环境),比如IAR Embedded Workbench 或 Keil MDK ARM 。此外还需要获取官方提供的API函数库简化编程工作量。 #### 实现方法 - 初始化阶段:配置好各硬件参数之后加载固件程序至MCU内部闪存区; - 连接设置:启动后先扫描周围可用信道寻找最佳频率点加入现有网络成为合法成员之一;如果是首次开机则需创建一个新的PAN ID(个人区域网标识符); - 功能逻辑编写: ```c void processCommand(uint8_t cmd){ switch(cmd){ case CMD_OPEN: moveCurtain(CURTAIN_FULLY_OPEN); break; case CMD_CLOSE: moveCurtain(CURTAIN_FULLY_CLOSED); break; default : // Handle unknown commands or errors here. break; } } ``` - 数据交互处理:接收来自APP端下发的操作指令并通过串口发送给底层硬件层解析执行相应动作;与此同时定时上报当前状态信息至上位机供监控查看。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值