RF4463F30半双工模组,伪全双工透传方案(STM32平台)(第二章,业务逻辑)

本文介绍了在STM32平台上,使用RF4463F30半双工模组实现伪全双工透传的方案。内容涵盖核心代码编写,包括宏定义、变量声明、功能函数如发送数据、接收数据、解包等。此外,还详细阐述了时间管理、工作状态管理和数据队列管理。该方案经过测试,稳定性良好,但速度有待提高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

环境已经搭建完毕,接下来逐步移植模块

核心代码编写

宏定义和变量声明

相关宏定义

//通用移植
#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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值