基于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闪烁,已实现多节点通信。
|