Quellcode durchsuchen

1.实现环形BUFFER栈中间件错误,实现后进先出,和循环覆盖;
2.版本日期升级到20221101;
3.修复平台响应帧引起的采控通信延时问题;
4. 修正主动发送配置参数,FRAM地址配置冲突隐患;
5. 增加RTC时钟,解决断电RTC时钟归零问题;
6. 增加将A1数据帧序列号放入FRAM中存储,在软件生命周期中,序列号连序;

libo vor 2 Jahren
Ursprung
Commit
330152f4cf
13 geänderte Dateien mit 268 neuen und 63 gelöschten Zeilen
  1. 15 9
      Inc/KeySlave485.h
  2. 4 1
      Inc/main.h
  3. 2 2
      Src/CollectMaster485.c
  4. 1 1
      Src/KeySlave485.c
  5. 15 10
      Src/TerminalSlave485.c
  6. 45 13
      Src/TerminalSlave485_jt808.c
  7. 22 10
      Src/freertos.c
  8. 1 1
      Src/main.c
  9. 50 0
      Src/usart.c
  10. 0 3
      func/func_ram_record.c
  11. 0 4
      func/func_ram_record.h
  12. 109 6
      lib/lib_buffer.c
  13. 4 3
      lib/lib_buffer.h

+ 15 - 9
Inc/KeySlave485.h

@@ -238,23 +238,32 @@
 #define 	ADDR_Zero_Of_LiquidMeter	0x0064	//	100	兼容8仓	液位计零点
 #define 	ADDR_Zero_Of_TankCapacity	0x0084	//	132		罐容Vt零点
 #define 	ADDR_ManHoLe_Number				0x00A4	//	164		人孔盖卸油阀数量
+//add poly 20221027 FRAM地址与ADDR_OiLType_Data地址冲突,将外部地址也内部地址分离
+#define 	FRAM_ADDR_Scan_Param			0x00C4	//	196		长度16字节,存储主动发送配置参数
+#define 	FRAM_ADDR_Scan_flowID			0x00D4	//	212		长度4字节,发送序列ID存储
+//end add poly
 #define 	ADDR_OiLType_Data					0x00E4	//	228		油品参数   膨胀系数 0.0008  0.0012
-#define 	ADDR_Sensor_Scan_Param		0x00F4	//	xy, 以此首地址的16字节区域,存放类F3协议终端功能的传感器轮询参数配置
+//modify poly 20221027 FRAM地址与ADDR_OiLType_Data地址冲突,将外部地址也内部地址分离
+#define 	IDEX_ADDR_Scan_Param			0x00F4	//	xy, 以此首地址的16字节区域,存放类F3协议终端功能的传感器轮询参数配置
+//end modify poly
 #define 	ADDR_Zero_Of_TempSensor		0x0104	//	260		温度偏移参数
 #define 	ADDR_TankShape_01					0x0124	//	292	1—4仓	罐车参数1
 #define 	ADDR_TankShape_02					0x0164	//	356	5—8仓	罐车参数2
 #define 	ADDR_SampIntervaL_Collector	0x01A4	//	420	单位为毫秒。取值范围为	同采集板的采样间隔
 #define 	ADDR_CommuIntervaL_ScreenDwin	0x01B4	//	436		同迪文屏的通信间隔
 #define 	ADDR_SleepTime_ScreenDwin	0x01C4	//	452		屏幕休眠时间
-#define 	ADDR_RTC_ScreenDwin	0x01CC	//	460		屏幕RTC标定
-#define 	ADDR_TiltAngle_Sensor	0x01DC	//	476		倾角补偿参数
+//modify boly 20221027  存储当前RTC时间
+#define 	IDEX_ADDR_RTC_ScreenDwin	0x01CC	//	460		屏幕RTC标定,只作为对外接口参数不存入FRAM中
+#define 	FRAM_ADDR_TIME_record			0x01CC	//	460		存储当前RTC时间
+//end modifyy 
+#define 	ADDR_TiltAngle_Sensor			0x01DC	//	476		倾角补偿参数
 #define 	ADDR_WarningOf_TiltAngle	0x01EC	//	492	x报警门限5度,y报警门限5度,启用报警。	倾角报警门限
 #define 	ADDR_Auto_OilStatic_Judgement	0x01FC	//	508	10s滑动窗口时间,3mm液位波动,启用自动稳油	自动稳油参数/打印机自动稳油判断
 #define 	ADDR_Restart_ContBoard	0x020C	//	524		复位指令
 #define 	ADDR_Unique_ID_ContBoard	0x0210	//	528		唯一ID
 #define 	ADDR_VersionOf_Software	0x0220	//	544	1.0.0.0	软件版本号
 #define 	ADDR_VersionOf_Hardware	0x0240	//	576	1.0.0.1	硬件版本号
-#define 	ADDR_VersionOf_LCD	0x0260		//608		
+#define 	ADDR_VersionOf_LCD			0x0260		//608		
 #define 	ADDR_FactoryParam_ContBoard	0x0280	//	640	所有参数恢复为默认值	出厂参数
 #define 	ADDR_SelfTest_ContBoard	0x0284	//	644		自检结果
 #define 	ADDR_BaudRate_ContBoard	0x0288	//	648		波特率
@@ -264,7 +273,6 @@
 #define 	ADDR_Precision_ContBoard	0x02C8	//	712		精度
 #define 	ADDR_TempFactor_ContBoard	0x02D8	//	728		温度补偿系数
 #define 	ADDR_YmodemMode_ContBoard	0x02E8	//	744		Ymodem模式
-#define 	ADDR_Reserve001_ContBoard	0x02EC	//	748		Res001
 
 //李伟修改  20211130   压力报警上限、下限、温度上限、下限、温度修正、压力窗口时长、压力正偏门限、负偏门限、压力修正、算法类型等
 //数据格式统一标准化未浮点数,每个数据占用4字节。平台下发数据均为浮点数格式,控制板根据需要进行强制类型转换。
@@ -310,17 +318,15 @@
 #define 	ADDR_Enable_BlankSeal			0x07A4  //	1956		是否允许空仓施封
 
 #define 	ADDR_Enable_DispSysInfo		0x07A8	//	1960		是否允许显示系统信息等
-
 #define 	ADDR_Sensor_Scan_FRAM			0x07f4	//	2036		是否允许显示系统信息等
 
-#define 	ADDR_TIME_record					0x0900	//	2304		存储上电时间信息
+
 //add boly 20221021
-#define 	ADDR_JT808_DataBack				0x0941	//	2369 	控制板	平台确定808-串口透传的传感器数据上报
+#define 	IDEX_ADDR_JT808_DataBack				0x0941	//	2369 	控制板	平台确定808-串口透传的传感器数据上报
 //end boly
 //以下参数不用保存在FRAM中,地址跟实际的存储地址无关联,仅用于功能跳转   --开启液位传感器,压力传感器,断电保存,两边有油算法,允许重复施封,液晶类型,保留字,自动施封
 #define 	ADDR_Enable_ReSeal				0x4000	//	16384		是否允许显示系统信息等
 
-
 //////最高地址不大于0x07ff=2047
 
 

+ 4 - 1
Inc/main.h

@@ -63,8 +63,10 @@ extern "C" {
 #include <stdlib.h>
 #include "stm32f7xx_hal.h"
 
-#define REMOTE_IAP_UPDATA 		0 	//是否是远程升级
+#define REMOTE_IAP_UPDATA 		1 	//是否是远程升级
 #define WATCH_DOG_ON 					1   //是否打开看门狗 //0----关闭看门狗SP706   1----打开看门狗SP706
+#define USE_RAM_RECORD    		1   //是否启用RAM数据缓存重发机制
+
 
 #if REMOTE_IAP_UPDATA>0
 #define IR_ROM1 	0x8080000 //APP2
@@ -73,6 +75,7 @@ extern "C" {
 #endif
 
 #define USE_FATFS_RECORD 			0  //FATFS文件补传功能
+#define USE_TIME_FRAM		 			1  //FRAM中存储时间,保证掉电时间连续
 
 extern uint32_t sd000,sd001;//浮点数转换为实时显示的参数,4字节
 extern uint16_t uart4RxCounter; //串口4接收数据计数器

+ 2 - 2
Src/CollectMaster485.c

@@ -422,7 +422,7 @@ void ValStateConvertTo91(void)
 			//-----------------------------------------------------1号传感器结束,只实现了第1仓,剩下7仓未实现
      //李伟修改 20210206     根据上午会议讨论,1仓位置与7仓位置交换------结束
 }
-
+uint32_t a1_cnt  = 0;
 #include "Elec_Seal.h"
 uint16_t CheckInFrame_Collect485(uint16_t LenRx,uint16_t MsgID)
 {
@@ -492,7 +492,7 @@ uint16_t CheckInFrame_Collect485(uint16_t LenRx,uint16_t MsgID)
 					//__nop();
 				
 				 // LenRx_0xA1=LenRx;
-				  
+				  a1_cnt++;
 				  memcpy(Array_Of_IO_0xA1,USART2_RX_BUF,64);
 				
 					//__nop();

+ 1 - 1
Src/KeySlave485.c

@@ -38,7 +38,7 @@ uint8_t product_code[20] = "JL-SIMS-CJ-V2.1";				 //
 uint8_t product_ID[20] = "20210730001";						 //产品ID
 
 char Version_software[30] = "KZB09A0_20220210_Temp1";
-uint32_t Version_Soft[8] = {2,2,3,13,1,1,0,20221025};
+uint32_t Version_Soft[8] = {2,2,3,13,1,1,0,20221101};
 
 uint8_t flag_exitReset = 0;	 //终止复位命令
 uint8_t flag_Uart4_Busy = 0; //表明打印机占用了总线,暂停语音播报

+ 15 - 10
Src/TerminalSlave485.c

@@ -498,7 +498,7 @@ Data_frame_TypeDef data_frame,Tx_data_frame;
 
 int32_t WholeCarData(uint8_t *buf);
 int32_t StoreData(uint8_t *buf,int storeNo);
-int BuildTimeCmd(uint8_t *pBuf);
+
 void Reboot_System()
 {
 	 __set_FAULTMASK(1);
@@ -5035,7 +5035,7 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 						FM25L16B_Read_N_Bytes(ADDR_Foot_info,T2C_RemoteCaliDat001.PayLoadData+4,1);
 						T2C_RemoteCaliDat001.NumberOfRegs = 5;
 						break;
-				case	ADDR_RTC_ScreenDwin:
+				case	IDEX_ADDR_RTC_ScreenDwin://ADDR_RTC_ScreenDwin:
 					ds1302_SynTime(&m_datetime);
 					T2C_RemoteCaliDat001.PayLoadData[0] = m_datetime.year;
 					T2C_RemoteCaliDat001.PayLoadData[1] = m_datetime.month;
@@ -5046,7 +5046,7 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 				
 					T2C_RemoteCaliDat001.NumberOfRegs = 6;
 					break;
-				case ADDR_RTC_ScreenDwin+1:
+				case IDEX_ADDR_RTC_ScreenDwin+1://ADDR_RTC_ScreenDwin+1:
 					memset(T2C_RemoteCaliDat001.PayLoadData,0,24);
 					ds1302_SynTime(&m_datetime);
 					T2C_RemoteCaliDat001.PayLoadData[3] = m_datetime.year;
@@ -5086,8 +5086,8 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
  					FM25L16B_Read_N_Bytes(ADDR_OiLType_Data,T2C_RemoteCaliDat001.PayLoadData,32);
 					T2C_RemoteCaliDat001.NumberOfRegs = 32;
 					break;
-				case	ADDR_Sensor_Scan_Param:
- 					FM25L16B_Read_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
+				case	IDEX_ADDR_Scan_Param:
+ 					FM25L16B_Read_N_Bytes(FRAM_ADDR_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
 					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
       		break;	
 				default:
@@ -5397,8 +5397,8 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					T2C_RemoteCaliDat001.NumberOfRegs = 32; 
       		break;
 
-				case	ADDR_Sensor_Scan_Param:
- 					FM25L16B_Write_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
+				case	IDEX_ADDR_Scan_Param:
+ 					FM25L16B_Write_N_Bytes(FRAM_ADDR_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
 					jt808_InitSensorScanParam();
 					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
       			break;	
@@ -5426,7 +5426,7 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					T2C_RemoteCaliDat001.NumberOfRegs=8;				
 		 			break;
 				
-				case	ADDR_RTC_ScreenDwin://ÆÁÄ»RTC±ê¶¨
+				case	IDEX_ADDR_RTC_ScreenDwin: //ADDR_RTC_ScreenDwin://ÆÁÄ»RTC±ê¶¨
  					//FM25L16B_Write_N_Bytes(ADDR_RTC_ScreenDwin,T2C_RemoteCaliDat001.PayLoadData,16); 	
 					//5A A5 0B 82 00 9C 5A A5 32 0A 01 0B 0C 0D
 					//:390195510001000601CC8942778899AA15060c01020366466C766644256666777788884423C0000111122223333444455556666777788889999abcdCCCCBBBB
@@ -5449,7 +5449,7 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					}*/
 					T2C_RemoteCaliDat001.NumberOfRegs = 6;
       			break;
-				case ADDR_RTC_ScreenDwin+1:
+				case IDEX_ADDR_RTC_ScreenDwin+1://ADDR_RTC_ScreenDwin+1:
 					for(i000=0;i000<6;++i000)
 					{
 						time_Set_Dwin[8+i000] = T2C_RemoteCaliDat001.PayLoadData[i000*4+3];
@@ -5575,11 +5575,16 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					T2C_RemoteCaliDat001.NumberOfRegs = 1;
 					break;
 				//add boly 20221021
-				case ADDR_JT808_DataBack:
+				case IDEX_ADDR_JT808_DataBack:
 				{
 					jt808_recv_func_DataBack(T2C_RemoteCaliDat001.PayLoadData, T2C_RemoteCaliDat001.NumberOfRegs);
 					memset((void *)&T2C_RemoteCaliDat001, 0x00, sizeof(T2C_RemoteCaliDat001));	
 					memset((void *)Pass41SensorScanParam.rx_buf, 0x00, sizeof(Pass41SensorScanParam.rx_buf));
+					
+					if(tmrForRemoteCali > (SPAN_RemoteCali_INTERVAL - 10))
+					{
+						tmrForRemoteCali = 0;
+					}
 					return 1;
 				};//break;				
 				//end boly

+ 45 - 13
Src/TerminalSlave485_jt808.c

@@ -29,6 +29,7 @@
 #include "func_ram_record.h"
 /* Private macro------------------------------------------------------------------------------*/
 /* Private typedef----------------------------------------------------------------------------*/
+#pragma pack(1)
 typedef struct SEND_DATA_UNIT_STC
 {
 	uint32_t flowID;								//发送数据ID
@@ -47,15 +48,15 @@ typedef struct JT808_DATA_OBJ
 	
 	SEND_DATA_UNIT_STC send_data;
 }JT808_DATA_OBJ; 
-
+#pragma pack()
 /* Private define-----------------------------------------------------------------------------*/
 /* Private variables--------------------------------------------------------------------------*/
 Pass41SensorScanParam_TypeDef Pass41SensorScanParam; 
 JT808_DATA_OBJ jt808_obj = {
-	.flowID 					= 1,
-	.back_cnt					= 0,		//接收超时计数
-	.link_cnt					= 0,	
-	.link_ok					= 0,	
+	.flowID 						= 1,
+	.back_cnt						= 0,		//接收超时计数
+	.link_cnt						= 0,	
+	.link_ok						= 0,	
 	
 	.send_data.flowID		= 0,
 	.send_data.lenth		= 0,
@@ -604,7 +605,7 @@ void jt808_link_check(void)
 				jt808_obj.link_cnt = 0;
 		}
 		
-		if(jt808_obj.link_cnt > 5)
+		if(jt808_obj.link_cnt > 0)
 		{
 			jt808_obj.link_ok = true; 
 		}
@@ -662,7 +663,8 @@ void jt808_recv_func_DataBack(uint8_t * buf ,uint8_t len)
 		//清除发送缓冲区数据
 		memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
 		//从内存数据栈中读取缓冲数据
-		read_len = func_ram_record_delete((void *)&(jt808_obj.send_data), DATA_UNIT_SIZE);
+		read_len = func_ram_record_delete((void *)&(jt808_obj.send_data), DATA_UNIT_SIZE);	
+		
 		if( read_len != DATA_UNIT_SIZE)
 		{
 			memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
@@ -676,6 +678,31 @@ void jt808_recv_func_DataBack(uint8_t * buf ,uint8_t len)
 	}
 	return;
 }
+/**
+ ***************************************
+ * 将发送序列ID放入FRAM
+ * 输入:当前发送序列号
+ * 返回: 无
+ ***************************************
+ */
+void jt808_save_Scan_flowID(uint32_t flowID)
+{
+	FM25L16B_Write_N_Bytes(FRAM_ADDR_Scan_flowID, (uint8_t *)&flowID, sizeof(flowID));
+	return;
+}
+/**
+ ***************************************
+ * 初始化数据帧序列ID
+ * 输入:发送序列号指针地址
+ * 返回: 无
+ ***************************************
+ */
+void jt808_read_Scan_flowID(uint32_t * flowID)
+{
+	FM25L16B_Read_N_Bytes(FRAM_ADDR_Scan_flowID, (uint8_t *)flowID, sizeof(flowID));
+	return;
+}
+
 /**
  ***************************************
  * 将发送缓冲区中的数据,放入RAM,并将当前
@@ -759,7 +786,9 @@ void jt808_DoInternalSensorScanAndPost(void)
 			jt808_save_send_data(USART1_TX_BUF, ylen);
 			nstep = 0;
 			emergencyflag = 0;
+			
 			jt808_obj.flowID++;
+			jt808_save_Scan_flowID(jt808_obj.flowID);
 		}
 		else
 		{
@@ -772,7 +801,8 @@ void jt808_DoInternalSensorScanAndPost(void)
 				//检测当前连接状态,每一大循环执行一次
 				jt808_link_check();
 				
-				jt808_obj.flowID++;
+				jt808_obj.flowID++;				
+				jt808_save_Scan_flowID(jt808_obj.flowID);
 			}
 			else if(nstep % Pass41SensorScanParam.nstep == (Pass41SensorScanParam.nstep/2)) 
 			{
@@ -801,10 +831,11 @@ void jt808_DoInternalSensorScanAndPost(void)
 void jt808_InitSensorScanParam(void)
 {
 	uint8_t data[16];
+	
 	//初始化补传缓冲区内存
 	func_ram_record_init();
 	
-	FM25L16B_Read_N_Bytes(ADDR_Sensor_Scan_Param, data, 16);
+	FM25L16B_Read_N_Bytes(FRAM_ADDR_Scan_Param, data, 16);
 	if(data[0] == 0x5A){
 		uint8_t *buf = data+1;
 		Pass41SensorScanParam.enable = 1;
@@ -829,13 +860,14 @@ void jt808_InitSensorScanParam(void)
 			Pass41SensorScanParam.cmd_arr[1] = 0x91;
 		}
 	}else{
-		Pass41SensorScanParam.enable = 0;
+		Pass41SensorScanParam.enable = 1;
 		Pass41SensorScanParam.step = 5;
 		Pass41SensorScanParam.nstep = 6;
-		Pass41SensorScanParam.cmd_num = 2;
-		Pass41SensorScanParam.cmd_arr[0] = 0x40;
-		Pass41SensorScanParam.cmd_arr[1] = 0x91;
+		Pass41SensorScanParam.cmd_num = 1;
+		Pass41SensorScanParam.cmd_arr[0] = 0xA1;
 	}
+	//初始化发送序列ID
+	jt808_read_Scan_flowID(&(jt808_obj.flowID));
 }
 
 #endif    /*************APP_TERMINALSLAVE485_JT808_USE*******************/

+ 22 - 10
Src/freertos.c

@@ -69,7 +69,7 @@
 #include "func_record.h"
 #include "Data_deal.h"
 #include "DS1302.h"
-
+#include "lib_ringfs_example.h"
 #include "DS1302Drv.h"
 #include "usart.h"
 #include <string.h> //memset函数
@@ -436,7 +436,9 @@ static void AppObjCreate (void)
 void MX_FREERTOS_Init(void)
 {
 	/* USER CODE BEGIN Init */
-
+#if 0
+	lib_ringfs_main();
+#endif	
 	/* USER CODE END Init */
 
 	/* USER CODE BEGIN RTOS_MUTEX */
@@ -501,6 +503,7 @@ uint8_t TimeBuf[7]  = {0x20,0x21,0x12,0x29,0x13,0x28,0x55};
   * @param  argument: Not used 
   * @retval None
   */
+int i001 = 0;
 /* USER CODE END Header_Task_Usart_GetAllSensorData */
 void Task_Usart2_Collector(void const *argument)
 {
@@ -515,7 +518,7 @@ void Task_Usart2_Collector(void const *argument)
 	//
 
 	/* Infinite loop */
-	int i001 = 0;
+	//int i001 = 0;
 	tmrForRemoteCali=SPAN_RemoteCali_INTERVAL;
 	//	uint8_t keyVal=0;
 	while (1)
@@ -1000,10 +1003,11 @@ void Task_Usart1_Terminal(void const *argument)
 	  /* USER CODE END Task_Usart1_Terminal */
 }
 
+#if  USE_TIME_FRAM
 
 void fram_time_read(SDateTime * p_datetime)
 {
-	FM25L16B_Read_N_Bytes(ADDR_TIME_record, (uint8_t *)p_datetime, sizeof(SDateTime));
+	FM25L16B_Read_N_Bytes(FRAM_ADDR_TIME_record, (uint8_t *)p_datetime, sizeof(SDateTime));
 	return;
 }
 
@@ -1013,7 +1017,7 @@ void ds1302_time_init(SDateTime datetime)
 	buf[1] = datetime.year%100 ;		  //年 
 	buf[2] = datetime.month;		   		//月 
 	buf[3] = datetime.day;		   			//日 
-	buf[4] = datetime.hour;		     	//时 
+	buf[4] = datetime.hour;		     		//时 
 	buf[5] = datetime.min;		     		//分 
 	buf[6] = datetime.sec&0x7f; 			//秒,屏蔽秒的第7位,避免超出59
 	
@@ -1023,9 +1027,10 @@ void fram_time_write(SDateTime datetime)
 {
 	datetime.min++;
 	
-	FM25L16B_Write_N_Bytes(ADDR_TIME_record, (uint8_t *)&datetime, sizeof(SDateTime));
+	FM25L16B_Write_N_Bytes(FRAM_ADDR_TIME_record, (uint8_t *)&datetime, sizeof(SDateTime));
 	return;
 }
+#endif
 /* USER CODE BEGIN Header_Task_GetCPU_Usage */
 /**
 * @brief Function implementing the Data_Process thread.
@@ -1042,10 +1047,13 @@ void Task_GetCPU_Usage(void const *argument)
 	int i_task01;
 	EventBits_t uxBits;
 	ds1302_Init();
-	
+#if USE_TIME_FRAM	
 	fram_time_read(&m_datetime);
 	ds1302_time_init(m_datetime);
+#endif //======USE_TIME_FRAM=============	
 	UNUSED(min);
+
+	
 #if 0	
 	while(1)
 	{
@@ -1072,19 +1080,23 @@ void Task_GetCPU_Usage(void const *argument)
 			ds1302_SynTime(&m_datetime);
 			hour = m_datetime.hour;
 		}
-#if USE_FATFS_RECORD	
+
 		//add boly 20221019
 		if(m_datetime.min!=min)
 		{
+			
+#if USE_TIME_FRAM			
 			fram_time_write(m_datetime);
 			min = m_datetime.min;
-#if 1			
+#endif //==============USE_TIME_FRAM====================
+			
+#if 0			
 			m_datetime.day++;
 			ds1302_time_init(m_datetime);
 #endif			
 		}
 		//end boly
-#endif  //-----------USE_FATFS_RECORD-----------//
+    //-----------USE_FATFS_RECORD-----------//
 		uxBits = xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
                                      TASK_BIT_ALL,       /* 等待TASK_BIT_ALL被设置 */
                                      pdTRUE,             /* 退出前TASK_BIT_ALL被清除,这里是TASK_BIT_ALL都被设置才表示“退出”*/

+ 1 - 1
Src/main.c

@@ -221,7 +221,7 @@ int main(void)
   /* USER CODE END 2 */
 	
 #if USE_FATFS_RECORD
-	//add boly 20221014
+	//add boly 20221014  SD¿¨ FATFS×é¼þ³õʼ»¯
 	func_fatfs_init();
 	func_fatfs_main();
 	//end boly

+ 50 - 0
Src/usart.c

@@ -96,6 +96,54 @@ DMA_HandleTypeDef hdma_usart1_rx;
 DMA_HandleTypeDef hdma_usart2_rx;
 DMA_HandleTypeDef hdma_usart3_rx;
 
+//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
+//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
+#if 0
+#pragma import(__use_no_semihosting)             
+//标准库需要的支持函数                 
+struct __FILE 
+{ 
+	int handle; 
+}; 
+
+FILE __stdout;       
+//定义_sys_exit()以避免使用半主机模式    
+void _sys_exit(int x) 
+{ 
+	x = x; 
+} 
+//重定义fputc函数 
+int fputc(int ch, FILE *f)
+{ 	
+	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//更具实际情况更改驱动
+	return ch;
+}
+
+#elsif 0
+
+
+#ifdef __GNUC__
+  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
+     set to 'Yes') calls __io_putchar() */
+  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
+#else
+  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
+#endif /* __GNUC__ */
+/**
+  * @brief  Retargets the C library printf function to the USART.
+  * @param  None
+  * @retval None
+  */
+PUTCHAR_PROTOTYPE
+{
+  /* Place your implementation of fputc here */
+  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
+  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//更具实际情况更改驱动
+ 
+  return ch;
+}
+#endif
+
 /* UART4 init function */
 void MX_UART4_Init(void)
 {
@@ -674,7 +722,9 @@ void UartWrite(UART_HandleTypeDef *uartHandle, uint8_t *buf , uint8_t len)
 int fputc(int ch,FILE *f)
 {
     uint8_t temp[1]={ch};
+		KeySlave485_TX_Set(1);
     HAL_UART_Transmit(&huart4,temp,1,2);        //
+		KeySlave485_TX_Set(0);
 		return 0;
 }
 /* USER CODE END 1 */

+ 0 - 3
func/func_ram_record.c

@@ -26,7 +26,6 @@
 #include "cmsis_os.h"
 #include "main.h"
 
-#define  USE_RAM_RECORD    0
 
 #if USE_RAM_RECORD==0
 void 		 func_ram_record_init(void)											//¼Ç¼Îļþ³õʼ»¯
@@ -51,8 +50,6 @@ uint32_t func_ram_record_delete(uint8_t *buf,uint32_t len)
 #include "Data_deal.h"
 /* Private includes ----------------------------------------------------------*/
 #include "lib_buffer.h"
-
-
 #include "func_ram_record.h"
 /* Private typedef -----------------------------------------------------------*/
 

+ 0 - 4
func/func_ram_record.h

@@ -36,9 +36,6 @@ extern "C" {
 /* USER CODE END Includes */
 
 /* Exported types ------------------------------------------------------------*/
-/* USER CODE BEGIN ET */
-
-/* USER CODE END ET */
 
 /* Exported constants --------------------------------------------------------*/
 /* USER CODE BEGIN EC */
@@ -50,7 +47,6 @@ extern "C" {
 #define DATA_UNIT_SIZE 			256
 
 
-
 /* Exported functions prototypes ---------------------------------------------*/
 void 		 func_ram_record_init(void);											//¼Ç¼Îļþ³õʼ»¯
 uint32_t func_ram_record_write(uint8_t *buf ,uint32_t len);

+ 109 - 6
lib/lib_buffer.c

@@ -2,7 +2,8 @@
 #include "string.h"
 #include "stdlib.h"
 #include "lib_buffer.h"
-#define validLen (Object->push_size - Object->pop_size)    //缓冲区有效长度
+#define validLen (Object->push_size - Object->pop_size)    //缓冲区有效长度
+int TBuffer_discard(TBufffer Object, int size)   ;
 
 TBufffer TBuffer_Init(TBuffferOBJ *data, void *buffer, int buff_size)
 {
@@ -21,6 +22,19 @@ TBufffer TBuffer_Init(TBuffferOBJ *data, void *buffer, int buff_size)
     return result;
 }
 
+void TBuffer_Reset(TBufffer Object)
+{
+
+    if (Object != NULL)
+    {
+        Object->pValid = Object->pHead;
+        Object->pValidTail = Object->pHead;
+        Object->push_size = 0;
+        Object->pop_size = 0;
+    }
+    return ;
+}
+
 void TBuffer_Fini(TBuffferOBJ *data)
 {
     if (data != NULL)
@@ -32,12 +46,26 @@ void TBuffer_Fini(TBuffferOBJ *data)
 
 int TBuffer_Push(TBufffer Object, const void *data, int size)
 {
+		if( validLen < size)
+		{
+			TBuffer_discard(Object,size);
+		}
+		
+		if(Object->pop_size >= Object->push_size )
+		{
+			TBuffer_Reset(Object);
+		}
+		
     int result = 0;
     int _ValidLength = Object->push_size - Object->pop_size;
     int _Size = Object->size - _ValidLength;    //实际可用 为0?
     if (data == NULL)
-        result = -1;
-    else if (size > 0 && _Size > 0) //保留原本不能丢弃
+		{
+			result = -1;
+			return result;
+		}		
+        
+    if (size > 0 && _Size > 0) //保留原本不能丢弃
     {
         if (_Size < size)
             size = _Size;
@@ -66,8 +94,13 @@ int TBuffer_Peek(TBufffer Object, void *data, int size)//返回实际尺寸
 {
     int result = 0;
     if (data == NULL)
-        result = -1;
-    else if (size > 0 && Object->pop_size != Object->push_size)
+		{
+			result = -1;
+			return result;
+		}
+        
+    
+		if (size > 0 && Object->pop_size != Object->push_size)
     {
         int _ValidLength = Object->push_size - Object->pop_size;
         if (size > _ValidLength)//可能会push validLen变大 导致size变大越界
@@ -87,7 +120,46 @@ int TBuffer_Peek(TBufffer Object, void *data, int size)//返回实际尺寸
     return result;
 }
 
-int TBuffer_Pop(TBufffer Object, void *data, int size)                                                                        
+int TBuffer_Pop(TBufffer Object, void *data, int size)
+{
+    int result = 0;
+    if (data == NULL)
+        result = -1;
+    else if (size > 0 && Object->pop_size != Object->push_size)
+    {
+        int _ValidLength = Object->push_size - Object->pop_size;
+        if (size > _ValidLength)//可能会push validLen变大 导致size变大越界
+            size = _ValidLength;
+				
+				if((Object->pValidTail - size) >= Object->pHead)		
+				{
+					//数据在缓冲区中间,一次性读取;
+					Object->pValidTail = Object->pValidTail - size;
+					memcpy(data, Object->pValidTail, size);
+					memset(Object->pValidTail, 0x00, size);
+				}
+				else
+				{					
+					//数据在缓冲区首尾,需要分两段读取
+					Object->pValidTail = Object->pValidTail + Object->size - size;	
+					
+					int RestLength = Object->pTail - Object->pValidTail;
+					memcpy(data, Object->pValidTail, RestLength);
+					memset(Object->pValidTail, 0x00, RestLength);
+					
+					memcpy((char*)data+RestLength, Object->pHead, size - RestLength);	
+					memset(Object->pHead, 0x00, size - RestLength);
+				}
+
+				result = size;
+        Object->pop_size += result;
+    }
+    // printf("pop = %s\n",(char*)data);   
+    return result;
+}
+
+
+int TBuffer_Pop_head(TBufffer Object, void *data, int size)                                                                        
 {
     int result = 0;
     if (data == NULL)
@@ -117,3 +189,34 @@ int TBuffer_Pop(TBufffer Object, void *data, int size)
     // printf("pop = %s\n",(char*)data);   
     return result;
 }
+
+
+int TBuffer_discard(TBufffer Object, int size)                                                                        
+{
+    int result = 0;
+
+    if (size > 0 && Object->pop_size != Object->push_size)
+    {
+        int _ValidLength = Object->push_size - Object->pop_size;
+        if (size > _ValidLength)//可能会push validLen变大 导致size变大越界
+            size = _ValidLength;
+        if (Object->pValid + size > Object->pTail)//需要分成两段copy
+        {
+            int rest = Object->pTail - Object->pValid;
+            memset(Object->pValid, 0x00,  rest);
+            memset(Object->pHead, 0x00,  size - rest);//第二段,绕到整个存储区的开头
+            Object->pValid = Object->pHead + size - rest;//更新已使用缓冲区的起始
+        }
+        else
+        {
+            memset(Object->pValid, 0x00, size);
+            Object->pValid = Object->pValid + size;
+            if (Object->pValid == Object->pTail)
+                Object->pValid = Object->pHead;
+        }
+        result = size;
+        Object->pop_size += result;
+    }
+    // printf("pop = %s\n",(char*)data);   
+    return result;
+}

+ 4 - 3
lib/lib_buffer.h

@@ -8,9 +8,9 @@ typedef struct
     unsigned char  *pTail;//环形存储区的结尾地址   
     unsigned char  *pValid;//已使用的缓冲区的首地址
     unsigned char  *pValidTail;//已使用的缓冲区的尾地址
-    unsigned int pop_size;
-    unsigned int push_size;
-    unsigned int   size;
+    unsigned int 		pop_size;
+    unsigned int 		push_size;
+    unsigned int   	size;
 } TBuffferOBJ;
 
 typedef TBuffferOBJ* TBufffer;
@@ -20,4 +20,5 @@ void TBuffer_Fini(TBuffferOBJ *data);
 int TBuffer_Push(TBufffer Object, const void *data, int size);
 int TBuffer_Peek(TBufffer Object, void *data, int size); //返回实际尺寸
 int TBuffer_Pop(TBufffer Object, void *data, int size);
+
 #endif