浏览代码

适配808串口透传,update

xuy 2 年之前
父节点
当前提交
16670728dc
共有 6 个文件被更改,包括 154 次插入15 次删除
  1. 7 1
      Inc/KeySlave485.h
  2. 15 6
      MDK-ARM/TestF7.uvguix.86150
  3. 75 4
      Src/TerminalSlave485.c
  4. 54 3
      Src/freertos.c
  5. 1 1
      Src/gpio.c
  6. 2 0
      Src/usart.c

+ 7 - 1
Inc/KeySlave485.h

@@ -6,7 +6,7 @@
 //必须配置三项参数:看门狗,液位计类型,油品类型。李伟修改  20210420
 
 //0----关闭看门狗SP706   1----打开看门狗SP706--------------必须配置的参数1/3
-#define WatchDogOn   						1   //是否打开看门狗 
+//#define WatchDogOn   						1   //是否打开看门狗 
 //#define WatchDogOn   							0   //是否打开看门狗 
 
 #define TIME_OF_Break_seal_cnt 		1  //30     连续破封判断次数
@@ -249,6 +249,7 @@
 #define 	IDEX_ADDR_Read_WorkSt			0x00D8	//	216		用于响应上位机下发的运行状态数据帧
 
 #define 	ADDR_OiLType_Data	0x00E4	//	228		油品参数   膨胀系数 0.0008  0.0012
+#define 	IDEX_ADDR_Scan_Param			0x00F4	//	xy, 以此首地址的16字节区域,存放类F3协议终端功能的传感器轮询参数配置
 #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
@@ -256,6 +257,7 @@
 #define 	ADDR_CommuIntervaL_ScreenDwin	0x01B4	//	436		同迪文屏的通信间隔
 #define 	ADDR_SleepTime_ScreenDwin	0x01C4	//	452		屏幕休眠时间
 #define 	ADDR_RTC_ScreenDwin	0x01CC	//	460		屏幕RTC标定
+#define 	FRAM_ADDR_TIME_record			0x01CC	//	460		存储当前RTC时间
 #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液位波动,启用自动稳油	自动稳油参数/打印机自动稳油判断
@@ -319,8 +321,12 @@
 #define 	ADDR_Enable_BlankSeal	0x07A4     //	1956		是否允许空仓施封
 
 #define 	ADDR_Enable_DispSysInfo	0x07A8	//	1960		是否允许显示系统信息等
+#define 	ADDR_Sensor_Scan_FRAM			0x07f4	//	2036		是否允许显示系统信息等
 
 
+//add boly 20221021
+#define 	IDEX_ADDR_JT808_DataBack				0x0941	//	2369 	控制板	平台确定808-串口透传的传感器数据上报
+//end boly
 //以下参数不用保存在FRAM中,地址跟实际的存储地址无关联,仅用于功能跳转   --开启液位传感器,压力传感器,断电保存,两边有油算法,允许重复施封,液晶类型,保留字,自动施封
 #define 	ADDR_Enable_ReSeal	0x4000	//	16384		是否允许显示系统信息等
 

文件差异内容过多而无法显示
+ 15 - 6
MDK-ARM/TestF7.uvguix.86150


+ 75 - 4
Src/TerminalSlave485.c

@@ -1,4 +1,5 @@
 #include "TerminalSlave485.h"
+#include "TerminalSlave485_jt808.h"
 #include "CollectMaster485.h"
 #include "ScreenMaster485.h"
 #include "KeySlave485.h"
@@ -13,6 +14,8 @@
 #include "DS1302.h"
 #include "leaf_ota.h"
 #include "md5c.h"
+#include "cmsis_os.h"
+#include "func_queue_record.h"
 
 /* zhuzl 20211220 增加为了内蒙定时上送*/
 uint32_t circle_send;
@@ -497,7 +500,7 @@ Data_frame_TypeDef data_frame,Tx_data_frame;
 void Reboot_System()
 {
 	 __set_FAULTMASK(1);
-#if (WatchDogOn)
+#if (WATCH_DOG_ON)
 	  while (1)
 	  {
 		  __nop();
@@ -561,7 +564,18 @@ void TerminalSlave485_Send_Data(uint8_t *buf,uint16_t len)
 	TerminalSlave485_TX_Set(1);			//设置为发送模式
   	//HAL_UART_Transmit(&huart1,buf,len,1000);//串口1发送数据  
 //	TerminalSlave485_TX_Set(0);			//设置为接收模式	
-	memcpy(terminal_buf,buf,len);
+
+	// 如果来自41串口的报文回应,需要粘合原样5字节头部,其中将长度内容适配下即可
+	if(Pass41SensorScanParam.rx_buf[0] > 0){
+		memcpy(terminal_buf,Pass41SensorScanParam.rx_buf,5);
+		terminal_buf[2] = len;
+		memcpy(terminal_buf+5,buf,len);
+		len += 5;
+		Pass41SensorScanParam.rx_buf[0] = 0;
+	}else{
+		memcpy(terminal_buf,buf,len);
+	}
+	
 	if(HAL_UART_Transmit_IT(&huart1,terminal_buf,len)!=HAL_OK)
 	{
 		TerminalSlave485_TX_Set(0);			//设置为接收模式	
@@ -1128,6 +1142,18 @@ void Data_analysis(void)
 		usart1_rx_flag=0;
 		usart_timesec=0;
 		f3_flag=0;
+
+		// xy,匹配到0x0139为首的5字节的头,表示是41串口透传下行的数据
+		// 5字节的头定义为:
+		//     [0][1] -- 01 39
+		//     [2] -- 透传有效数据长度
+		//     [3][4] -- 流水号
+		if( (USART1_RX_BUF[0]==0x01) && (USART1_RX_BUF[1]==0x39)){
+			memcpy(Pass41SensorScanParam.rx_buf,USART1_RX_BUF,5);
+			memcpy(USART1_RX_BUF,USART1_RX_BUF+5,rx1_len-5);
+			rx1_len -=5;
+		}
+		
 		if((USART1_RX_BUF[0]==':') && (USART1_RX_BUF[1]==0xa5) && (USART1_RX_BUF[1]==0xa5))
 		{
 			memcpy(USART1_RX_BUF,USART1_RX_BUF+1,rx1_len-5);
@@ -3557,12 +3583,15 @@ Return_data * IO_Tx_Readvalue(uint16_t ID,uint16_t length)//
 //*******************************************************************************/
 static uint8_t test_send_cnt = 0;//重要数据连续上报5次
 static uint8_t Emergencyflag  =0 ;//重要数据发送标志
+uint8_t  temp_buf[137]={0};//大小+1  136
 Return_data * Seal_Tx_Readvalue(uint16_t ID,uint16_t length)//读取电子铅封的应答 0:默认 1:解封 2 :施封 3:破封
 {
-	uint8_t  temp_buf[137]={0};//大小+1  136
 	static Return_data temp;
 	uint8_t  i,j=0;
 	uint8_t Byte_high,Byte_low;
+
+	memset(temp_buf,0x00,sizeof(temp_buf));
+	
 	if(Sealing_Data.Sealing_up_datetype != 1)//常规数据上报
 	{
 		Emergencyflag = 0;
@@ -5060,6 +5089,13 @@ 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	IDEX_ADDR_Scan_Param:
+ 					FM25L16B_Read_N_Bytes(FRAM_ADDR_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
+					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
+      		        break;	
+				case	IDEX_ADDR_Read_WorkSt: 					
+					T2C_RemoteCaliDat001.NumberOfRegs = jt808_Build_Read_WorkSt(T2C_RemoteCaliDat001.PayLoadData); 
+      		break;
 				default:
 
 					//memset(&USART1_TX_BUF[33], '=', sizeof(USART1_TX_BUF) - 33);
@@ -5366,7 +5402,19 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					}
 					T2C_RemoteCaliDat001.NumberOfRegs = 32; 
       		break;
-					
+      		
+				case	IDEX_ADDR_Scan_Param:
+ 					FM25L16B_Write_N_Bytes(FRAM_ADDR_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
+					jt808_InitSensorScanParam();
+					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
+      			break;	
+
+      			case	IDEX_ADDR_Read_WorkSt:
+      			    memset(queue_record_obj.cmd,0,sizeof(queue_record_obj.cmd));
+ 					strncpy(queue_record_obj.cmd, (char *)T2C_RemoteCaliDat001.PayLoadData, sizeof(queue_record_obj.cmd)-1);
+					T2C_RemoteCaliDat001.NumberOfRegs = 16; 
+      			break;
+      			
 				case	ADDR_TiltAngle_Sensor://倾角补偿参数  ----长度为16字节
  					FM25L16B_Write_N_Bytes(ADDR_TiltAngle_Sensor,T2C_RemoteCaliDat001.PayLoadData,16);
 					T2C_RemoteCaliDat001.NumberOfRegs=16;	
@@ -5397,7 +5445,16 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 				  memcpy(&time_Set_Dwin[8],T2C_RemoteCaliDat001.PayLoadData,6);
 				  ScreenMaster485_Send_Data(time_Set_Dwin,14);
 					//memcpy(TimeBuf+1,T2C_RemoteCaliDat001.PayLoadData,6);
+#if 	1				
+					uint8_t times_buf[32];
+					memset(times_buf, 0x00,sizeof(times_buf));
+					memcpy(times_buf+1,T2C_RemoteCaliDat001.PayLoadData,6);
+					ds1302_Write_Time(times_buf);
+#else				
 					ds1302_Write_Time(T2C_RemoteCaliDat001.PayLoadData-1);
+#endif				
+					ds1302_SynTime(&m_datetime);
+					fram_time_write(m_datetime);
 					/*for(i001=0;i001<6;i001++)
 					{
 						sprintf((char*)(&USART1_TX_BUF[33+i001]),"%02X",T2C_RemoteCaliDat001.PayLoadData[i001]);
@@ -5530,6 +5587,20 @@ int 	Process_CMD_0x39_RemoteCali(uint8_t dataMode)
 					FM25L16B_Write_N_Bytes(ADDR_Enable_BlankSeal, T2C_RemoteCaliDat001.PayLoadData, 1);
 					T2C_RemoteCaliDat001.NumberOfRegs = 1;
 					break;
+				//add boly 20221021
+				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
 				default:
 					T2C_RemoteCaliDat001.NumberOfRegs = sprintf(T2C_RemoteCaliDat001.PayLoadData, "Write Address Error! %08X\r\n", T2C_RemoteCaliDat001.AddrRegStart);
 					break;

+ 54 - 3
Src/freertos.c

@@ -1056,6 +1056,34 @@ void Task_Usart1_Terminal(void const *argument)
 	} //while(1)
 	  /* USER CODE END Task_Usart1_Terminal */
 }
+#if  USE_TIME_FRAM
+
+void fram_time_read(SDateTime * p_datetime)
+{
+	FM25L16B_Read_N_Bytes(FRAM_ADDR_TIME_record, (uint8_t *)p_datetime, sizeof(SDateTime));
+	return;
+}
+
+void ds1302_time_init(SDateTime datetime)
+{
+	uint8_t buf[32] = {0};
+	buf[1] = datetime.year%100 ;		  //年 
+	buf[2] = datetime.month;		   		//月 
+	buf[3] = datetime.day;		   			//日 
+	buf[4] = datetime.hour;		     		//时 
+	buf[5] = datetime.min;		     		//分 
+	buf[6] = datetime.sec&0x7f; 			//秒,屏蔽秒的第7位,避免超出59
+	
+	ds1302_Write_Time(buf);
+}
+void fram_time_write(SDateTime datetime)
+{
+	datetime.min++;
+	
+	FM25L16B_Write_N_Bytes(FRAM_ADDR_TIME_record, (uint8_t *)&datetime, sizeof(SDateTime));
+	return;
+}
+#endif
 
 /* USER CODE BEGIN Header_Task_GetCPU_Usage */
 /**
@@ -1068,12 +1096,17 @@ SDateTime m_datetime;
 void Task_GetCPU_Usage(void const *argument)
 {
 	/* USER CODE BEGIN Task_GetCPU_Usage */
-	char min=-1;
+	char hour=0xff;
+	char min=0xff;
 	int count;
 	int i_task01;
 	EventBits_t uxBits;
 	ds1302_Init();
-	//HAL_Delay(100);
+#if USE_TIME_FRAM	
+	fram_time_read(&m_datetime);
+	ds1302_time_init(m_datetime);
+#endif //======USE_TIME_FRAM=============	
+	UNUSED(min);
 	count=0;
 	/* Infinite loop */
 	while (1)
@@ -1081,11 +1114,29 @@ void Task_GetCPU_Usage(void const *argument)
 		//DispRunInfo();//显示运行信息
 		cntUsage++;
 		osDelay(500); //阻塞延时,根据情况调节
-		if(m_datetime.min!=min)
+		//2022-9-13, xy, 这里RTC时钟是按每分钟去读取一下RTC芯片校时的,但实在没必要如此频繁,优化成每小时
+		if(m_datetime.hour!=hour)
 		{
 			ds1302_SynTime(&m_datetime);
+			hour = m_datetime.hour;
+		}
+
+		//add boly 20221019
+		if(m_datetime.min!=min)
+		{
+			
+#if USE_TIME_FRAM			
+			fram_time_write(m_datetime);
 			min = m_datetime.min;
+#endif //==============USE_TIME_FRAM====================
+			
+#if 0			
+			m_datetime.day++;
+			ds1302_time_init(m_datetime);
+#endif			
 		}
+		//end boly
+		
 		uxBits = xEventGroupWaitBits(xCreatedEventGroup, /* 事件标志组句柄 */
                                      TASK_BIT_ALL,       /* 等待TASK_BIT_ALL被设置 */
                                      pdTRUE,             /* 退出前TASK_BIT_ALL被清除,这里是TASK_BIT_ALL都被设置才表示“退出”*/

+ 1 - 1
Src/gpio.c

@@ -114,7 +114,7 @@ void MX_GPIO_Init(void)
   /*Configure GPIO pin : PtPin */
   GPIO_InitStruct.Pin = DWI_Pin;
 	
-	if(WatchDogOn)//打开看门狗sp706
+	if(WATCH_DOG_ON)//打开看门狗sp706
 	//if(1)//打开看门狗sp706
 	{
 		//

+ 2 - 0
Src/usart.c

@@ -673,8 +673,10 @@ void UartWrite(UART_HandleTypeDef *uartHandle, uint8_t *buf , uint8_t len)
 // ÖØ¶¨Ïòº¯Êý1
 int fputc(int ch,FILE *f)
 {
+#if 0
     uint8_t temp[1]={ch};
     HAL_UART_Transmit(&huart4,temp,1,2);        //
+#endif
 		return 0;
 }
 /* USER CODE END 1 */