打印
[应用相关]

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

[复制链接]
1204|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fesxp|  楼主 | 2015-7-22 22:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
基于STM32W108的SimpleMac协议栈编写程序,实现多个无线节点之间的通信。节点分为SUN节点和PLANET节点,SUN节点使用STM32W108无线开发板,PLANET节点使用STM32W108无线数据采集节点,SUN节点可与PC机进行通信。

编程与实现
程序的设计基于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))  
下面的代码参考了《STM32W108嵌入式无线传感器网络》邱铁,夏锋,周玉编著.清华大学出版社,2014年5月出版的
函数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");



实例设计:多节点互相通信,以信号灯的亮灭作为判断依据,同样,对发包的函数和接收数据包的函数添加LED闪烁功能,发包后信号灯就闪烁,从而实现一个节点可同时控制多个节点的LED等闪烁。

参考第10章中的节点程序烧写方法,分别对SUN节点和PLANET节点烧写程序,进行如下的操作。SUN节点通过串**叉线与PC机相连,SUN节点初始状态,开机显示节点信息以及选择的信道等信息。


对于按下PLANET节点上的S3按键,实现PLANET节点向SUN节点发送数据包操作与前面的贴子两节点通信相同,在此就不再详细列出。由以上实例结果得出,PLANET节点均有LED闪烁,已实现多节点通信。


沙发
mmuuss586| | 2015-7-22 22:06 | 只看该作者

不错,学习下;

使用特权

评论回复
板凳
Fe_ARM| | 2015-7-22 22:09 | 只看该作者
是否可以进行无线传感器网络温度数据采集

使用特权

评论回复
地板
米尔豪斯| | 2015-7-22 23:51 | 只看该作者
通信距离有多远,最多可以几个节点

使用特权

评论回复
5
fesxp|  楼主 | 2015-7-23 07:46 | 只看该作者
通信距离400m左右,节点个数没有限制

使用特权

评论回复
6
zh113214| | 2015-7-23 12:55 | 只看该作者
很好的学习资料 感谢分享

使用特权

评论回复
7
小浣熊| | 2015-7-23 12:58 | 只看该作者
谢谢楼主分享,学习学习

使用特权

评论回复
8
fesxp|  楼主 | 2015-7-23 17:08 | 只看该作者
进行无线传感器网络温度数据采集,是没有问题的。

使用特权

评论回复
9
hdwgt| | 2015-7-24 20:06 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

19

帖子

1

粉丝