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