基于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)函数的声明,不然不能执行这个函数。

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值