我是靠谱客的博主 正直唇膏,最近开发中收集的这篇文章主要介绍zigbee协议栈初使用(四)无线串口透传,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

zigbee协议栈初使用(四)无线串口透传
串口透传意思是通过Zigbee实现两个PC通讯,两个Zigbee模块地位应该是一样的。
  在void MT_UartInit(),有代码如下:
1#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = MT_UartProcessZToolData;
2#elif defined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = MT_UartProcessZAppData;
3#else
uartConfig.callBackFunc = NULL;
4#endif
加粗部分是协议栈数据串口接收处理函数,进入函数定义。
函数根据网蜂《zigbee实战指南》进行了更改,直接删除原先的用改后的,代码如下:


/*****************网蜂修改**************************/

void MT_UartProcessZToolData ( uint8 port, uint8 event )
{
  uint8 flag = 0,i,j = 0;  //flag判断有没有数据,j记录数据长度
  uint8 buf[128];         //缓冲128
  (void)event;

  while(Hal_UART_RxBufLen(port)) //检测串口数据是否完成
  {
    HalUARTRead(port,&buf[j],1);//数据接收到buf
    j++;
    flag = 1;
  }
  if(flag == 1)   //有数据时
  {//分配内存,结构体+内容+长度
    pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof
                                                   ( mtOSALSerialData_t )+j+1);
    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];
    osal_msg_send( App_TaskID, (byte *)pMsg ); // 登记任务并发往上层
    osal_msg_deallocate ( (uint8 *)pMsg ); // 释放内存
  }
}

更改后数据串口接收处理流程为:
 1、接收数据
 2、判断长度然后给数据包pMsg分配内存
 3、打包发给上层OSAL处理
 4、释放内存
显然这里得到的数据包由 datalen + data组成;
接下来对得到的数据包放到任务中处理,显然应该是在SampleApp.c,找到任务处理函数uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )前文中提起过,

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
  afIncomingMSGPacket_t *MSGpkt;
  (void)task_id;  // Intentionally unreferenced parameter

  if ( events & SYS_EVENT_MSG )
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        //串口接收数据后由MT_USART层传来数据,用网蜂方法接收,编译时不定义MT相关内容
        case CMD_SERIAL_MSG:
          SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);
          break;

中文备注下是添加部分, SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);为自定义的无线发送函数,代码如下:

void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg) //网蜂提供
{
    uint8 i,len,*str=NULL;     //len有用数据长度
    str=cmdMsg->msg;          //指向数据开头
    len=*str;                //msg里的第1个字节代表后面的数据长度
    /********打印出串口接收到的数据,用于提示*********/
    for(i=1;i<=len;i++)
        HalUARTWrite(0,str+i,1 ); 
    HalUARTWrite(0,"n",1 );//换行  
    /*******发送出去,同无线数据传输********/
    if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                        SAMPLEAPP_COM_CLUSTERID,//自己定义一个
                        len+1,                // 数据长度         
                        str,                     //数据内容
                        &SampleApp_TransID, 
                        AF_DISCV_ROUTE,
                    AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
    {
    }
    else
    {
    // Error occurred in request to send.
    } 
}

1#define SAMPLEAPP_COM_CLUSTERID 3 ,数据包号自己添加
接下来打印函数

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //接收数据
{

  uint8 len,i;
  switch ( pkt->clusterId )
  {
    case SAMPLEAPP_COM_CLUSTERID: //数据包ID
      HalUARTWrite(0, "message:", sizeof("message:"));        //提示信息
      len=pkt->cmd.Data[0];
      for(i=0;i<len;i++)
        HalUARTWrite(0,&pkt->cmd.Data[i+1],1);//发给 PC 机
      HalUARTWrite(0,"n",1); // 回车换行
      break;


  }
}

最后还要修改预编译,注释掉 MT 层的内容。这里注意,选择了协调器、路
由器、或者终端编译时都要修改 options 的。
参考如下:
ZIGBEEPRO
NWK_AUTO_POLL(需要自动重连时加入)
ZTOOL_P1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
分别下载到协调器(必须),终端(或路由)。

最后

以上就是正直唇膏为你收集整理的zigbee协议栈初使用(四)无线串口透传的全部内容,希望文章能够帮你解决zigbee协议栈初使用(四)无线串口透传所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部