SM32W108无线射频模块多个节点之间通信实例中分别对SUN节点和PLANET节点进行说明。节点上电是首先进行硬件及相应变量的初始化,然后创建网络,循环检测是否有数据包。如果接到数据包,对其进行解析,根据不同类型的数据包执行不同的操作。于此同时读取串口信息,如果串口有输入命令,对命令进行解析,执行不同的操作。
PLANET节点首先进行一些初始化工作,然后申请加入网络,加网成功后,循环监测是否有数据包及按键是否被按下,如果有数据包对其进行解析,执行相应的操作,如果按键被按下,则向SUN节点发送数据包,并让LED3闪烁一次。
程序的设计基于SimpleMac协议栈进行,以下给出部分主要相关代码。该实例中的部分代码与第11章中的两节点通信实例代码相同,本章不再重复说明。
文件solar-system.c部分内容:
部分变量全局变量定义:
//负载类型定义 #define PT_SLEEPING (0x08) #define PT_LED (0x09) #define PT_TRSEND (0x0A)
//数据包类型定义 #define SYN_SLEEPING_WAITTIME ((FT_DATA <<4) | (PT_SLEEPING <<0)) #define SYN_LED_WAITTIME ((FT_DATA <<4) | (PT_LED <<0)) #define TRSEND_PACKET ((FT_DATA <<4) | (PT_TRSEND <<0)) |
函数processRxPacket():
/************************************************************************** 功能描述:对接收的数据包进行解析,并执行相应的操作 输入参数:无 输出参数:无 *************************************************************************/ void processRxPacket(void) { ...... ...... …… //不同类型数据包进行不同处理 switch(packetType) { case (GENERIC_DATA_PACKET): //普通类型数据包 RX_DETAILS(printf("GENERIC_DATA_PACKET\r\n");) #ifdef SUN_ROLE halToggleLed(LED_D1); //让LED1闪烁 halCommonDelayMilliseconds(500);//延迟500ms halClearLed(LED_D1); //关闭LED1 #endif #ifdef PLANET_ROLE halToggleLed(LED_D3); //让LED3闪烁 halCommonDelayMilliseconds(500); //延迟500ms halClearLed(LED_D3); //关闭LED3 #endif rxData.lqi = calculateLqi(rxData.errors, (rxData.packet[0]+3)); //计算通信链路质量 printf("RX: Addr=0x%04X, VDD=%dmV, RxSFD=0x%05X, ", shortSrcAddr, ((rxData.packet[payloadStart+1]<<0)|(rxData.packet[payloadStart+2]<<8)), rxData.time); if(rxData.packet[payloadStart+5]&0x80) //判断数据包是否包含SFD { //获取TX SFD数据,并输出 rxData.packet[payloadStart+5] &= ~0x80; printf("TxSFD=0x%05X, ", ((rxData.packet[payloadStart+3]<< 0)| (rxData.packet[payloadStart+4]<< 8)| (rxData.packet[payloadStart+5]<<16))); } else { printf("TxSFD=-------, "); } printf("RSSI=%ddBm, LQI=0x%02X\r\n", rxData.rssi, rxData.lqi); break;
#ifdef PLANET_ROLE case (SYN_SLEEPING_WAITTIME): //PT_SLEEPING类型数据包 printf("SYN_SLEEPING_WAITTIME\r\n"); halToggleLed(LED_D3); //闪烁LED3 halCommonDelayMilliseconds(1000); //延迟1000ms halClearLed(LED_D3); //关闭LED3 break; case (SYN_LED_WAITTIME): //PT_LED类型数据包 printf("SYN_LED_WAITTIME\r\n"); halToggleLed(LED_D3); //闪烁LED3 halCommonDelayMilliseconds(500); //延迟500ms halClearLed(LED_D3); //关闭LED3 halCommonDelayMilliseconds(500); halToggleLed(LED_D3); halCommonDelayMilliseconds(500); halClearLed(LED_D3); halCommonDelayMilliseconds(500); halToggleLed(LED_D3); halCommonDelayMilliseconds(500); |