上位机发命令修改休眠时间

    可以参考上一篇博文:https://blog.csdn.net/wearlee/article/details/80174822中的UART的串口收发,这样就可以为上位机发命令奠定基础。

   采用的大致思路就是,让协调器给终端结点发送数据,然后终端节点收到数据后改变发送数据的周期,也就是改变了休眠时长。代码如下:

static void rxCB( uint8 port, uint8 event )
{
  if (event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))    //接收到串口数据
  {
    HalUARTRead( 0, uartbuf, 3 );     //读取数据并存放到uartbuf数组中
    HalUARTWrite( 0, uartbuf, 3 );  //将接收到的字符输出到串口
  }
  if(uartbuf[0]=='1')
  {
    afAddrType_t GenericApp_DstAddr;
    GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;   //发送地址模式为单播
    GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;       //初始化端口号
    GenericApp_DstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR_DEVALL;              //向协调器发送
    AF_DataRequest( &GenericApp_DstAddr,                     //目的节点的网络地址和发送格式
                  &GenericApp_epDesc,                      //节点描述符
                  GENERICAPP_CLUSTERID,                    //簇ID
                   1, //发送数据长度
                  uartbuf,                 //发送数据缓冲区指针
                  &GenericApp_TransID,                     //指向发送序号的指针
                  AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); 
  } 
    
 
}
  

    协调器的发送函数如上所示。

  

static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  //unsigned char buffer[40] = "";
  
  switch ( pkt->clusterId )
  {
    case GENERICAPP_CLUSTERID:
      if(pkt->cmd.Data[0]=='1')
        abc=10000;
      break;
  }
  case AF_INCOMING_MSG_CMD:                                    //如果接收到新的无线数据
          GenericApp_MessageMSGCB( MSGpkt );         

以上2行代码是出现在GenericApp_ProcessEvent函数中出现的。这样大致就可以实现上位机发送命令,从而修改休眠时长。

PS:1.这里用串口组手用‘1’作测试发送命令来模拟上位机发送命令。

       2.pkt->cmd.Data[0](红色部分我居然漏掉了,怪不得一直报错)

      3.GenericApp_MessageMSGCB函数并不会自动运行的,接收到数据需要上述第三段代码段调用其才能使其运行。(要注意编译器的警告信息:定义了但是没有使用,说得就是如上情况)

       3.注意,这个DRFD_RCVC _ALWAYS_ON一直设置为TRUE,如果该玩意关闭的话。则会出现这样一种情况:终端节点正处于休眠过程中,协调器向终端节点发送数据,那么终端结点正在休眠过程中。此时,终端节点是无法收到数据命令的。

     4.上述的DRFD_RCVC _ALWAYS_ON(接收机)开了确实会在一定程度上增加功耗,若要进一步节省功耗。可以考虑以下2种方式:

     (1)f8config.cfg最下面那四个参数(要熟悉那四个参数是干嘛的),修改其中的2个参数。

     (2)有一个函数可以实现同样的效果。具体要去网上找下。

      以上2种方式可以让终端醒来后向父亲节点要数据,父亲节点帮他已经保存了数据,不影响其接收数据。另外有一点,父设备不会永久给子设备保留数据,协议栈默认是最多是7.5s的时间。当然这个值可以修改,但是不建议修改,这个值是经验值。

    需要了解下终端设备接收数据的原理,你的POLL_RATE设置成了多少,如果是0的话,那么DRFD_RCVC_ALWAYS_ON=FALSE的话确实是收不到数据的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值