可以参考上一篇博文: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的话确实是收不到数据的。