SM32W108无线射频模块多个节点之间通信实例

本文详细介绍了使用STM32W108无线射频模块实现SUN和PLANET节点间的通信过程。节点启动时进行硬件初始化,创建网络并持续检测数据包。接收到数据包后,根据数据类型执行不同操作,同时监听串口命令。PLANET节点在加入网络后,持续接收数据并响应按键操作。程序基于SimpleMac协议栈,涉及的关键函数包括processRxPacket()、sendVddDataPacket系列等。
摘要由CSDN通过智能技术生成

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值