传感网应用开发为了考试(Zigbee通信)
.ZigBee网络的自定义协议消息帧
起始位 + 命令类型 + 数据总长度 + 传感器个数 + 传感器类型 + 数据域 + 校验位
START + CMD + LEN + Count + TYPE + DATA0~DATAN + CHK
协议各个报文的协议详解:
起始位(START):固定值为0xCC;
命令类型(CMD):一般为0x01,获取采集数据;
数据总长度(LEN):从起始位到校验位(不包括校验位)之前的字节长度;
传感器个数(Count):根据传感器种类确定,如果采集温湿度个数为2;
传感器类型(TYPE):0x01代表温湿度,其它参考表3-29;
数据域(DATA0~DATAN):存储传感器数据;
校验位(CHK):从START到CHK字节之前的累加和,然后把累加和的结果与0xFF按位与,取得低8位数据CHK的值;
![在这里插入图片描述](https://img-blog.csdnimg.cn/f0d2aed338b0464c976d5d0bf691a20c.png?x-oss-process=image/wa
考试中ZigBee常考的知识点
1.配置和初始化
找到代码中static basicRfCfg_t **;,跳转到对应的basicRfCfg_t方法
看对应参数,例如
然后就回到主函数中进行如下定义
考试时方法名字可能会有改变,但初始化基本不变
2.根据自定义协议,将火焰传感器数据正确封装到uart0_send_buf[]数组中
uart0_send_buf[1] = (uint8)(adc_value >> 8); //读取ADC数据高位寄存器
uart0_send_buf[2] = (uint8)adc_value; //读取ADC数据低位寄存器
大概就是用这种方式进行封装火焰传感器数据
3.采集获得温湿度
//获取温湿度函数为call_sht11
call_sht11((unsigned int)(&sensor_tem),(unsigned int)(&sensor_hum));
Tx_Buff[4]=(uint8)sensor_tem;
Tx_Buff[5]=(uint8)sensor_hum;
Tx_Buff[6]=mc_check_crc8(Tx_Buff,6)
4.指示灯D3,D6,D5组成3位计数指示灯,循环指示数值0-7
//根据D3=LED1 D6=LED4 D5=LED3 3个LED灯进行计数显示
void show_cnt(uint8 num)
{
num=num%8;
switch(num)
{
case 0:
halLedClear(1);
halLedClear(4);
halLedClear(3);
break;
case 1:
halLedClear(1);
halLedClear(4);
halLedSet(3);
break;
case 2:
halLedClear(1);
halLedSet(4);
halLedClear(3);
break;
case 3:
halLedClear(1);
halLedSet(4);
halLedSet(3);
break;
case 4:
halLedSet(1);
halLedClear(4);
halLedClear(3);
break;
case 5:
halLedSet(1);
halLedClear(4);
halLedSet(3);
break;
case 6:
halLedSet(1);
halLedSet(4);
halLedClear(3);
break;
case 7:
halLedSet(1);
halLedSet(4);
halLedSet(3);
break;
}
}
这是建立在有"hal_led.h"这个文件的前提下,在使用halLedSet之前,也要有相应的初始化
5.ZigBee从模块收到ZigBee主模块发来的无线数据后,其板上的LED1也闪烁1次,并对收到的数据进行判断,当有火焰时使ZigBee从模块上的LED2闪烁,当无火焰时熄灭ZigBee从模块板上的LED2
while(1)
{
/*接收发送端(ZIGBEE通信模块主机)无线数据实现LED1灯闪烁,根据接收数据控制LED2灯闪烁*/
if(basicRfPacketIsReady())
{
halLedSet(1);
halMcuWaitMs(250);
halLedClear(1);
len = basicRfReceive(rxData,1,NULL);
if(len != 0)
{
if(rxData[0] == '1')
{
halLedSet(2); //点亮
led_flag = 1;//让它为1,就会执行下面if(led_flag == 1)即让灯亮度衰减,然后关闭灯
}
else if(rxData[0] == '0')
{
halLedClear(2);
led_flag = 0;
}
}
if(led_flag == 1){
halLedSet(2);
halMcuWaitMs(250);
halLedClear(2);
}
}
/*接收发送端(ZIGBEE通信模块主机)无线数据实现LED1灯闪烁,根据接收数据控制LED2灯闪烁*/
}
//这也是建立在有"hal_led.c"这个文件的前提下,在使用halLedSet之前,也要有相应的初始化,也需要检查头文件有没有写
在hal_mcu.c中halMcuWaitMs()方法为了能够闪烁
版权声明:本文为CSDN博主「weixin_50836732」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50836732/article/details/122135721
暂无评论