RF4463F30半双工模组,伪全双工透传方案(STM32平台)(第二章,业务逻辑)
前言
环境已经搭建完毕,接下来逐步移植模块
核心代码编写
宏定义和变量声明
相关宏定义
//通用移植
#define OUTSIDE USART3
#define O_2_I_BUFF USART3_RX_BUFF //外部数据导入缓存
#define O_2_I_LEN USART3_RX_LEN //外部数据当前缓存指针
#define I_2_O_BUFF USART3_TX_BUFF //内部数据对外发出缓存
#define I_2_O_LEN USART3_TX_LEN //内部数据当前缓存指针
#define I_2_O_QUEUE_LEN USART3_TX_QUEUE_LEN
#define I_2_O_END_LEN USART3_TX_END_LEN
上面这部分是用于对接stm32平台
#define MasterFlag //主从机标志位,有这个标志位表示是主机(如果是从机则需要注释)
#define FRAME_CLUB_MAX 20 //最大帧组队列长度
#define BUFF_LEN 100
#define BUFF_LEN_I 2000 //输入缓存区域
#define BUFF_LEN_O 3000 //输出缓存区域
#define BUFF_LEN_B BUFF_LEN_I
上面这部分是用于划分存储空间
#define PACK_MAX_DATA_LEN 35 //设定433模组间发送最大数据长度
#define PACK_LEN_lEN 1 //设定包的长度字节长度
#define PACK_NUMBER_lEN 2 //设定包的序号字节长度
#define PACK_FUNCTION_lEN 1 //设定包的类别字节长度
#define PACK_CHECK_lEN 1 //设定包的校验字节长度
#define MAX_PACK_NUMBER 0xfe //设定包序号的最大值为0xfe
#define PACK_OUTDATA_LEN (PACK_LEN_lEN+\
PACK_NUMBER_lEN+\
PACK_FUNCTION_lEN+\
PACK_CHECK_lEN)
//设定433模组间除数据外的长度
#define PACK_MAX_LEN (PACK_OUTDATA_LEN + PACK_MAX_DATA_LEN)
//设定433模组最大的数据长度
上面这部分是用于分配协议的字段
这部分可以自定义,我暂时是设计了4个字段,核心字段是长度和序号,其他都可有可无
但是我建议也基本按我这一套的设计走,至少包含:
长度,序号,功能码,校验
#define payload_length PACK_MAX_LEN+4 //44
#define freq_channel 0
struct FlagType{
unsigned char reach_1s ;
unsigned char is_tx ;
unsigned char rf_reach_timeout ;
unsigned char run ;
unsigned char is_rx ;
};
上面这部分是用于声明通用的标志位的
相关变量定义
#define tdata {'s','w','w','x',\
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 \
,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 \
,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 }
static unsigned char tx__data[220] = tdata ;
extern U8 rx_buf[100];
上面这部分是用于分配发送和接受缓存区域
长度和内容不重要,但是至少要大于等于发送长度,内存够用的话就暂时不必要优化一般可以把 220 替换成 payload_length 。
extern uint16_t frame_club[FRAME_CLUB_MAX+1][2]; //最大帧组 (新增的最后一位表示上一帧发送的数据)
extern __IO uint16_t frame_index_n; //当前的帧序号
extern __IO uint16_t frame_index_s; //准备发送的帧序号
extern __IO uint16_t frame_index_l; //奇数表示还在接受,偶数表示等待接受
extern uint8_t O_2_I_BUFF[BUFF_LEN_I];
extern uint8_t I_2_O_BUFF[BUFF_LEN_O];
extern uint16_t O_2_I_LEN;
extern uint16_t I_2_O_LEN;
extern uint16_t I_2_O_QUEUE_LEN;
extern uint16_t I_2_O_END_LEN;
extern __IO u32 g_sysUsartTime;
extern __IO u32 g_sysUsartTime_start;
extern __IO u32 g_buff_len;
extern __IO uint8_t saveFrameFlag;
extern uint8_t INSIDE_TX_BUFF[PACK_MAX_LEN]; //对内发送所需的临时缓存区域
extern uint16_t INSIDE_TX_LEN; //对内发送所需数据长度
extern __IO uint8_t outPutFlag; //对外输出标志位
extern __IO uint8_t setDataFlag; //编辑串口数据标志位
extern struct FlagType Flag;
上面这部分是用于分配数据队列缓存区域
主要有两个队列:
帧队列 frame_club
对外输出队列 I_2_O_BUFF
其中帧队列 存储的是指针 数据还是放在这里 O_2_I_BUFF
到此为止,主要的全局变量和宏定义已经声明了,接下来就是实现功能的代码了
工具函数
两个主要的工具函数
//***********************************************************************
//将发送区数数据重新按着433私有协议个格式重新打包
//***********************************************************************
void pack433Data (u8 *pData,u16 len,u8 mode)
{
u8 temporary[PACK_MAX_LEN] ={
0};
//-存入帧长度
temporary[0]=len; // 存入帧长度低字节
//-存入帧序号(——)还未启用
temporary[1]=0; // 存入帧序号高字节
temporary[2]=0; // 存入帧序号低字节
//-存入帧功能
temporary[3]=mode; // 存入帧功能
//-存入校验
temporary[4]=0; // 存入校验(——)还未启用
memcpy(&temporary[5],pData,len); //-存入帧数据
// //-存入校验
// temporary[7+len]=0-packSumCheck(temporary,9+len);//存入校验
memcpy(pData,temporary,PACK_OUTDATA_LEN+len);//打包完成
}
//***********************************************************************
//将接收区数据重新按着帧格式封存
//***********************************************************************
//static u16 len=0;
void saveFrameToBUFF(u16 pointnNumber,u8 timeoutFlag)
{
if(saveFrameFlag) //存帧标志位
return;
else
saveFrameFlag=1;
if(frame_club[frame_index_n][0]>pointnNumber) //获取帧长度
pointnNumber+=BUFF_LEN_B