一。IAR工程针对Zigbee的修改
补充:硬件配置
(1)拨码开关拨到公口处,协调器的连接

(2)协调器的烧写(Zigbee协调器也需要烧写)

(4)温湿度模块的烧写

1.寻找Zigbee项目文件。

2.使用IAR,Zigbee协调器的选择,Zigbee协调器代码烧写
注意:协调器与节点的代码在一个工程文件下,所以会有协调器选择或温湿度节点的选择。
编译前选择coordinatorEB不要选错

编译下载

3.编译前选择风扇与温度

(1)宏定义选择--》温湿度选择#define TMEP_NODE
风扇选择--》FAN_NODE

二。keil工程的修改
1.向keil工程中移植protocol.c protocol.h
(1)protocol.c
(2)protocol.h。这是zigbee的移植文件
2.对ZIgbee串口数据的接受
2.1usart.c
//主要配置使能uart1空闲中断-->串口中断的使能

__HAL_UART_ENABLE_IT(uartHandle,UART_IT_RXNE);
2.2freertos.c
//在zigbee任务中进行接收消息,解析消息
(1)头文件的加入

- #include "string.h"
- #include "protocol.h"
(2)创建Zigbee消息队列

- uint8_t ZigbeeBuff[40];
- osMessageQId ZigbeeQueueHandle;
(3)Zigbee消息队列的初始化

- osMessageQDef(ZigbeeQueue, 40, uint8_t);
- ZigbeeQueueHandle = osMessageCreate(osMessageQ(ZigbeeQueue), NULL);
(4)Zigbee消息接收

- void Zigbee_Task(void const * argument)
- {
- /* USER CODE BEGIN Zigbee_Task */
- uint8_t u8Index;
- /* Infinite loop */
- for(;;)
- {
- //每次读取消息之前,把索引初始化为0
- u8Index = 0;
- //1、一直等待接收消息,第一个消息应该放在消息缓冲区的第一个元素上
- if(xQueueReceive(ZigbeeQueueHandle,&ZigbeeBuff[u8Index++],portMAX_DELAY)==pdPASS){
- while(xQueueReceive(ZigbeeQueueHandle,&ZigbeeBuff[u8Index++],50)){}
- //完成解析以后,要清空接收缓冲区,不然会出现问题
- ProtocolParse(ZigbeeBuff,u8Index-1);
- memset(ZigbeeBuff,0,40);
- }
- }
- /* USER CODE END Zigbee_Task */
- }
2.3stm32f4xx_it.c
//zigbee消息入队
(1)添加头文件

#include "cmsis_os.h"
(2)声明外部Zigbee

- extern osMessageQId ZigbeeQueueHandle;
- extern UART_HandleTypeDef huart3;
(3)串口中断接受数据

- uint8_t u8Data;
- if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == SET){
- u8Data = huart1.Instance->DR;
- xQueueSendFromISR(ZigbeeQueueHandle,&u8Data,NULL);
- }
3.数据封装CmdAndSensor.c
(1)加入头文件,控制zigbee节点(风扇)

- #include "protocol.h"
-
- FanControl((uint8_t)(Cmd));
4.httpserver-socket.c通信实现
(1)加入外部数据,修改

extern int SensorValue[3];
(2)得到数据字符串

- static void Get_SensorValue(void *buffer, void *value)
- {
-
- sprintf(buffer, "{\"temperature\":\"%d\",\"humidity\":\"%d\",\"light\":\"10021.1\"}", SensorValue[0], SensorValue[1]);
- }
(2)对风扇的控制
<1>加入头文件

#include "protocol.h"
<2>实现对风扇的控制

- static void Post_Cmd_Fan(void *buffer, void *value)
- {
- if (strstr(value, On))
- {
- sprintf(buffer, "{\"Status\":\"On\"}");
- FanControl(0x01);
- }
- else if (strstr(value, Off))
- {
- sprintf(buffer, "{\"Status\":\"Off\"}");
- FanControl(0x0);
- }
- else
- {
- sprintf(buffer, "{\"Status\":\"Error\"}");
- }
- }
5.对TempDLG.c修改
(1)修改外部数据(就是展示温湿度的数据)

extern int SensorValue[3];
(2)定义一个字符串

char SensorBuff[10];
(3)页面展示数据

- sprintf(SensorBuff,"%d",SensorValue[0]);
- TEXT_SetText(hItem, SensorBuff);
6.LightDLG.c修改 (与上面一样)
(1)外部数据声明(收到的温湿度),声明字符串(数据改为字符串,这样才可以展示)

- extern int SensorValue[3];
- char SensorBuff[10];
(2)展示出来

- sprintf(SensorBuff,"%d",SensorValue[2]);
- TEXT_SetText(hItem, SensorBuff);
7.HumDLG.c(同上)
(1)使用外部声明数据,声明字符串

- extern int SensorValue[3];
-
- char SensorBuff[10];
(2)数据展示( 通过数据)

- sprintf(SensorBuff,"%d",SensorValue[1]);
- TEXT_SetText(hItem, SensorBuff);
8.FanDLG.c(风扇不需要加入数据)

#include "CmdAndSensor.h"

vFanCmd(status);