功能:
对数据进行封包,加入校验,简单加密
2.主要解析及返回数据
使用说明:
1.主函数调用初始化函数wifi_buff_init()
2.串口中断调用add_message_queue()
3.主函数循环处理analyze_queue()
解释说明:
此协议固定协议长度为12
加密码0x03f7
4个帧头 48 45 53 5a
校验2个字节
类型2个字节
可以自定义各种数据类型
数据长度2个字节
表示12字节后的用户数据长度
版本2个字节
自定义预留参数
(都是低字节在前)
这些都是预留开发用,实际中可以不用
基本数据包: 48 45 53 5a 31 05 00 00 00 00 00 00
效果:
wifi_data_tran.h
#ifndef _WIFI_DATA_TRAN
#define _WIFI_DATA_TRAN
/*************************************************
com:未知科技
作者:何少
编写时间:2017-10-27
1.添加wifi_data_tran文件
功能:
对数据进行封包,加入校验,简单加密
2.主要解析及返回数据
使用说明:
1.主函数调用初始化函数wifi_buff_init()
2.串口中断调用add_message_queue()
3.主函数循环处理analyze_queue()
解释说明:
此协议固定协议长度为12
加密码0x03f7
4个帧头 48 45 53 5a
校验2个字节
类型2个字节
数据长度2个字节
版本2个字节
(都是低字节在前)
这些都是预留开发用,实际中可以不用
基本数据包: 48 45 53 5a 31 05 00 00 00 00 00 00
**************************************************/
#define _PROTOCOL_HEAD 12 //固定协议头长度
#define USER_DATA 30 //用户数据长度
#define HANDLE_DATA 20
#define RX_TX_LEN 20 //接收与发送数据长度
extern unsigned char volatile wifi_queue_buff[_PROTOCOL_HEAD + USER_DATA]; //数据包
extern unsigned char wifi_queue_buf_len;
extern volatile unsigned char *queue_out; //出队指针
extern unsigned short queue_all_len; //当前队列长度
extern unsigned char wifi_rx_buff[_PROTOCOL_HEAD+RX_TX_LEN]; //接收到的正确数据包
extern unsigned char wifi_tx_buff[_PROTOCOL_HEAD+RX_TX_LEN]; //发送的数据包
extern unsigned char handle_buff[HANDLE_DATA]; //接收到的数据
extern unsigned char wifi_rx_buff_len; //接收的数据包长度
extern unsigned char wifi_tx_buff_len; //发送数据包长度
extern unsigned char wifiwork_state; //模块工作状态
/*****************************************************************************
函数名称 : wifi_buff_init
功能描述 : wifi所有数据初始化
输入参数 :
返回参数 :
*****************************************************************************/
void wifi_buff_init(void);
/*****************************************************************************
函数名称 : analyze_queue
功能描述 : 分解队列
输入参数 :
返回参数 :
*****************************************************************************/
void analyze_queue(void);
/*****************************************************************************
函数名称 : add_message_queue
功能描述 : 添加数据到数据包
输入参数 :
返回参数 :
*****************************************************************************/
void add_message_queue(unsigned char value);
/*****************************************************************************
函数名称 : get_queue_data
功能描述 : 添加数据到数据包
输入参数 :
返回参数 :
*****************************************************************************/
unsigned char get_queue_data(void);
/*****************************************************************************
函数名称 : get_check_sum
功能描述 : 计算校验和
输入参数 : pack:数据源指针
pack_len:计算校验和长度
返回参数 : 校验和
*****************************************************************************/
unsigned short check_sum(unsigned char *pack, unsigned short pack_len);
/*****************************************************************************
函数名称 : analyze_message_queue
功能描述 : 分析数据包
输入参数 :
返回参数 :
*****************************************************************************/
void analyze_message_queue(unsigned char len);
/*****************************************************************************
函数名称 : handle_set_
功能描述 : 处理设置指令
输入参数 :
返回参数 :
*****************************************************************************/
void handle_set(unsigned char len);
/*****************************************************************************
函数名称 : handle_led
功能描述 : 事件处理
输入参数 : 函数名,处理参数
返回参数 :
*****************************************************************************/
void handle_led(void (*fun)(),unsigned char n);
/*****************************************************************************
函数名称 : set_tx_data
功能描述 : 设置发送数据
输入参数 : 要发送的数据
返回参数 :
*****************************************************************************/
void set_tx_data(unsigned char buf[],unsigned short len);
/*****************************************************************************
函数名称 : take_data
功能描述 : 提取接收到的数据
输入参数 :
返回参数 :
*****************************************************************************/
void take_data(void);
/*****************************************************************************
函数名称 : wifi_uart_write_data
功能描述 : 向wifi uart写入连续数据
输入参数 : in:发送缓存指针
len:数据发送长度
返回参数 : 无
*****************************************************************************/
void _wifi_uart_write_data(unsigned char *in, unsigned short len);
/*****************************************************************************
函数名称 : mymemcpy
功能描述 : 内存拷贝
输入参数 : dest:目标地址
src:源地址
count:数据拷贝数量
返回参数 : src:数据处理完后的源地址
*****************************************************************************/
void *my_memcpy(void *dest, const void *src, unsigned short count);
#endif
/*************************************************
com:未知科技
作者:何少
编写时间:2017-10-27
1.添加wifi_data_tran文件
功能:
对数据进行封包,加入校验,简单加密
2.主要解析及返回数据
使用说明:
1.主函数调用初始化函数wifi_buff_init()
2.串口中断调用add_message_queue()
3.主函数循环处理analyze_queue()
解释说明:
此协议固定协议长度为12
加密码0x03f7
4个帧头 48 45 53 5a
校验2个字节
类型2个字节
可以自定义各种数据类型
数据长度2个字节
表示12字节后的用户数据长度
版本2个字节
自定义预留参数
(都是低字节在前)
这些都是预留开发用,实际中可以不用
基本数据包: 48 45 53 5a 31 05 00 00 00 00 00 00
**************************************************/
#include "wifi_data_tran.h"
#include "sys.h"
#include "stdio.h"
/*******************************************************/
unsigned char volatile wifi_queue_buff[_PROTOCOL_HEAD + USER_DATA]; //数据包
unsigned char wifi_queue_buf_len;
unsigned short queue_all_len;
unsigned char wifi_rx_buff[_PROTOCOL_HEAD+RX_TX_LEN]; //接收到的正确数据包
unsigned char wifi_tx_buff[_PROTOCOL_HEAD+RX_TX_LEN]; //发送的数据包
unsigned char handle_buff[HANDLE_DATA];
unsigned char wifi_rx_buff_len;
unsigned char wifi_tx_buff_len;
volatile unsigned char *queue_out; //出队指针
unsigned char wifiwork_state; //wifi模块工作状态
/*****************************************************************************
函数名称 : wifi_buff_init
功能描述 : wifi所有数据初始化
输入参数 :
返回参数 :
*****************************************************************************/
void wifi_buff_init()
{
queue_out=wifi_queue_buff; //初始化出队指针
queue_all_len=0; //队列当前长度
wifi_rx_buff_len=0; //接收命令缓存
wifi_tx_buff_len=0; //发送命令缓存
}
/*****************************************************************************
函数名称 : get_queue_data
功能描述 : 添加数据到数据包
输入参数 :
返回参数 :
*****************************************************************************/
unsigned char get_queue_data(void)
{
unsigned char value;
if(queue_all_len > 0)
{
//有数据
if(queue_out >= (unsigned char *)(wifi_queue_buff + sizeof(wifi_queue_buff))) //出队指针要小于数据队列总长度
{
//数据已经到末尾
queue_out = (unsigned char *)(wifi_queue_buff); //重新指向数组头
}
value = *queue_out ++; //出队
queue_all_len --; //队列数据-1
}
return value;
}
/*****************************************************************************
函数名称 : add_message_queue
功能描述 : 添加数据到数据包
输入参数 : unsigned char value
返回参数 :
*****************************************************************************/
void add_message_queue(unsigned char value)
{
if(wifi_queue_buf_len<(_PROTOCOL_HEAD + USER_DATA)) //队列当前数据长度小于队列缓存总长度
{
wifi_queue_buff[wifi_queue_buf_len++]=value; //添加到队列
queue_all_len++; //
}
else
{
wifi_queue_buf_len=0; //队列缓存索引重新开始
wifi_queue_buff[wifi_queue_buf_len++]=value;
queue_all_len++; //队列长度
}
}
/*****************************************************************************
函数名称 : analyze_queue
功能描述 : 分解队列,在主函数里面循环
输入参数 :
返回参数 :
*****************************************************************************/
void analyze_queue(void)
{
short data_len=0; //索引
short rx_value_len=0; //接收包长度
int i;
while((wifi_rx_buff_len < sizeof(wifi_queue_buff)) && queue_all_len > 0) //接收包长度小于队列缓存长度,队列数据要大于0
{
u8 r=wifi_rx_buff[wifi_rx_buff_len ++] = get_queue_data();
//printf("%c",r);
}
if(wifi_rx_buff_len<12) return; //数据包小于12(最短数据包)
while((wifi_rx_buff_len - data_len) >= 12)
{
if(wifi_rx_buff[data_len] != 0x48)
{
data_len ++;
continue;
}
printf("\r\n H ok\r\n");
if(wifi_rx_buff[data_len + 1] != 0x45)
{
data_len ++;
continue;
}
printf("\r\n E ok\r\n");
if(wifi_rx_buff[data_len + 2] != 0x53)
{
data_len += 2;
continue;
}
printf("\r\n S ok\r\n");
if(wifi_rx_buff[data_len + 3] != 0x5a)
{
data_len += 3;
continue;
}
printf("\r\n 5a ok\r\n");
rx_value_len = wifi_rx_buff[data_len + 9] * 0x100 + wifi_rx_buff[data_len + 8] + 12; //用户数据+标准数据(帧头数据)
if(rx_value_len > sizeof(wifi_rx_buff))
{
data_len += 4;
continue;
}
printf("\r\n 长度 ok\r\n");
if((wifi_rx_buff_len - data_len) < rx_value_len)
{
break;
}
printf("\r\n 数据长度:%d ok\r\n",rx_value_len);
//数据接收完成
if(check_sum((unsigned char *)wifi_rx_buff + data_len,rx_value_len)
!= wifi_rx_buff[data_len + 5] * 0x100 + wifi_rx_buff[data_len + 4])
{
//校验出错
data_len += 4;
continue;
}
printf("\r\n 校验 ok\r\n");
#if 1//1为test
//打印出正确的接收到的协议
printf("recv:%d:",data_len);
for(i=0; i 0 && data_len>0)
{
my_memcpy(wifi_rx_buff,wifi_rx_buff + data_len,wifi_rx_buff_len);
}
}
/*****************************************************************************
函数名称 : get_check_sum
功能描述 : 计算校验和
输入参数 : pack:数据源指针
pack_len:计算校验和长度
返回参数 : 校验和
*****************************************************************************/
unsigned short check_sum(unsigned char *pack, unsigned short pack_len)
{
unsigned short i;
unsigned short check_sum = 0;
for(i = 0; i < pack_len; i ++)
{
if(i==4 || i==5)
{
pack ++;
continue; // 避开校验位;
}
check_sum += *pack++;
}
return (check_sum + 0x03f7);
}
/*****************************************************************************
函数名称 : analyze_message_queue
功能描述 : 分析数据包
输入参数 :
返回参数 :
*****************************************************************************/
void analyze_message_queue(unsigned char len)
{
switch(wifi_rx_buff[6]+wifi_rx_buff[7]*0x100)
{
}
}
/*****************************************************************************
函数名称 : handle_set_
功能描述 : 处理指令
输入参数 :
返回参数 :
*****************************************************************************/
void handle_set(unsigned char len)
{
//unsigned char buf[]={0x01,0x02,0x03,0x04,0x05}; //要发送的数据
take_data(); //提取数据
}
/*****************************************************************************
函数名称 : handle_led
功能描述 : 事件处理
输入参数 :
返回参数 :
*****************************************************************************/
void handle_led(void (*fun)(),unsigned char n)
{
fun(n);
}
/*****************************************************************************
函数名称 : set_tx_data
功能描述 : 设置发送数据
输入参数 : 要发送的数据
返回参数 :
*****************************************************************************/
void set_tx_data(unsigned char buf[],unsigned short len)
{
unsigned char i;
unsigned short buf_len = len; //发送数据的长度
unsigned short buf_sum; //发送数据的总和
char state_re[]={0x48,0x45,0x53,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //标准返回数据头
wifi_tx_buff_len=12;
for(i=0;i>8;
wifi_tx_buff[8]=buf_len&0x00ff; //数据和
wifi_tx_buff[9]=buf_len>>8;
for(i=0;i psrc + count))
{
for(i = 0; i < count; i ++)
{
pdest[i] = psrc[i];
}
}
else
{
for(i = count; i > 0; i --)
{
pdest[i - 1] = psrc[i - 1];
}
}
return dest;
}