📄 app.c
字号:
#include <string.h>
#include "app.h"
#include "mcu.h"
#include "config.h"
#include "my_ds18b20.h"
#include <ds18b20.h>
unsigned char app_TxBuffer[APP_MAX_PAYLOAD_SIZE];
unsigned char app_RxBuffer[APP_MAX_PAYLOAD_SIZE];
unsigned char app_FCF;
unsigned char app_RequestOrAck;
unsigned char wendu[9];
unsigned char app_ReceiveTemperature=0x00;
unsigned char Temperature[10]={"115.00125"};
/***********************************************************************
* 应用层系统初始化函数
************************************************************************/
void app_SysInit(void)
{
if( I_Am_What == COORDINATOR )
{
nwk_CreatNetwork();
app_PermitJoinIn();
}
if( I_Am_What == ENDPOINT )
{
nwk_JoinInNetwork();
DS18B20_Init();
ds18b20_temperature(0);
}
}
/***********************************************************************
* 清空应用层发送缓冲区
************************************************************************/
void app_TxBuffer_Clear(void)
{
memset(app_TxBuffer,'',APP_MAX_PAYLOAD_SIZE);
}
/***********************************************************************
* 清空应用层接收缓冲区
************************************************************************/
void app_RxBuffer_Clear(void)
{
memset(app_RxBuffer,'',APP_MAX_PAYLOAD_SIZE);
}
/***********************************************************************
* 应用层允许接收 (只对协调器有效)
************************************************************************/
void app_PermitJoinIn(void)
{
nwk_PermitJoinIn();
}
/***********************************************************************
* 应用层退出网络 (只对终端节点有效)
************************************************************************/
void app_LeaveNetwork(void)
{
nwk_LeaveNetwork();
}
/***********************************************************************
* 请求终端节点发送温度数据 (只对协调器有效)
************************************************************************/
void app_RequestTemperature(void)
{
unsigned char i;
app_FCF = APP_FCF_CMD;
app_RequestOrAck = APP_REQUEST;
app_TxBuffer[0] = app_FCF;
app_TxBuffer[1] = app_RequestOrAck;
for(i=0;i<MAX_ADDRTABLE;i++)
{
if(neighbor[i].Avail)
{
RLED2_EN();
rfTxInfo.destAddr = neighbor[i].ShortAddr;// 发送的目的地址
nwk_PackData(app_TxBuffer,2);
delay_ms(1000);
if(app_ReceiveTemperature) //成功接受节点温度信息
{
app_ReceiveTemperature = 0x00;
app_Send_Temperature_to_PC(wendu,i);
}
else //认为终端节点丢失,从邻居表中删除其信息,回收分配给它的 16 bit 地址
{
nwk_DeleteNeighborTable( neighbor[i].ShortAddr );
RLED3_TOGGLE();
}
RLED2_DISABLE();
delay_ms(200);
}
}
app_TxBuffer_Clear();
}
/***********************************************************************
* 请求终端节点发送温度数据的响应 (只对终端节点有效)
************************************************************************/
void app_RequestTemperature_ACK(void)
{
unsigned char i;
float temp;
app_FCF = APP_FCF_CMD;
app_RequestOrAck = APP_ACK;
app_TxBuffer[0] = app_FCF;
app_TxBuffer[1] = app_RequestOrAck;
temp=ds18b20_temperature(0);
ftoa(temp,5,Temperature); //转换浮点数temp为字符串temp_char,其中第二位参数指定四舍五入保留小数位(最多五位)。
for(i=0;i<10;i++)
{
app_TxBuffer[i+2] = Temperature[i];
}
rfTxInfo.destAddr = rfSettings.pRxInfo->srcAddr;
nwk_PackData(app_TxBuffer,11);
}
void app_DriveNoteOut(void)
{
unsigned char i;
for(i=0;i<MAX_ADDRTABLE;i++)
{
if(neighbor[i].Avail)
{
nwk_DriveNoteOut(neighbor[i].ShortAddr);
}
}
}
void app_SendData(void)
{
}
void app_PackData(void)
{
}
/***********************************************************************
* 应用层解包函数
************************************************************************/
void app_UnPackData(unsigned char *pPayload, unsigned char length)
{
unsigned char temp0,temp1,j;
temp0 = *pPayload++;
switch (temp0)
{
case APP_FCF_DATA:
{
break;
}
case APP_FCF_CMD: // 网络层命令
{
temp1 = *pPayload++;
switch (temp1)
{
case APP_REQUEST: // 请求命令
{
WLED_EN();
//发送温度信息给协调器
app_RequestTemperature_ACK();
WLED_DISABLE();
Sleep();//休眠模式:掉电模式
break;
}
case APP_ACK: // 命令响应
{
for(j=0;j<9;j++)
{
wendu[j] = *pPayload++;
}
//接收温度信息成功标志位置1
app_ReceiveTemperature = 0x01;
break;
}
default:
break;
}
}
default:
break;
}
}
void app_Send_Temperature_to_PC(unsigned char *temp,unsigned char id)
{
unsigned char str_USART[34];
unsigned char *str_USART_temp="";
unsigned char length=0;
unsigned char i;
//str_USART[0]='C';
str_USART[0]=0x43;
for(i=0;i<8;i++)
{
sprintf(str_USART_temp, "%x",neighbor[id].IEEEAddr[i]);
//sprintf(str_USART_temp, "%x",rfSettings.pRxInfo->srcIEEE[i]);
length = strlen(str_USART_temp);
if(length==2)
{
str_USART[3*i+1] = *str_USART_temp++;
str_USART[3*i+2] = *str_USART_temp;
str_USART[3*i+3] = ' ';
}
else if(length==1)
{
str_USART[3*i+1] = '0';
str_USART[3*i+2] = *str_USART_temp;
str_USART[3*i+3] = ' ';
}
else if(length==0)
{
str_USART[3*i+1] = '0';
str_USART[3*i+2] = '0';
str_USART[3*i+3] = ' ';
}
}
//length = strlen(temp);
length = 9;
for(i=0;i<length;i++)
{
str_USART[i+24] = *temp++;
}
USART0_Send_Str(str_USART);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -