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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
两个STM32之间无线通信可以通过使用nRF24L01无线模块来实现。这个模块可以作为发送和接收器使用,其中一个STM32作为发送器,另一个作为接收器。nRF24L01无线模块被选择是因为它的通信简单且成功率较高。在实验中,可以使用洋桃1开发板和正点原子战舰开V3发板作为两个STM32的硬件设备。需要注意的是,由于这两个板子的管脚数不同,所以在创建工程时要注意选择正确的芯片。通过编写程序,可以实现两个STM32之间无线通信,使用802.15.4/ZigBee的SimpleMac协议栈来实现通信。其中一个STM32作为SUN节点,另一个作为PLANET节点,SUN节点可以与PC机进行通信。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [STM32无线通信——nRF24L01通信模块](https://blog.csdn.net/qq_40546576/article/details/101398027)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32W108无线射频模块节点之间通信实例](https://blog.csdn.net/u010273356/article/details/46793365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值