From 0336357cf8d72c0c17c6fed3d5233f1e352e32ae Mon Sep 17 00:00:00 2001
From: zhyinch <zhyinch@gmail.com>
Date: 星期三, 16 二月 2022 19:57:40 +0800
Subject: [PATCH] 修改485控制BUG

---
 源码/核心板/Src/application/dw_app.c |  138 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 104 insertions(+), 34 deletions(-)

diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
index 20612af..5b14703 100644
--- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
+++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c"
@@ -1,5 +1,6 @@
 #include "dw_app.h"
 #include "ADC.h"
+#include "modbus.h"
 #define TDFILTER
 enum enumtagstate
 {
@@ -127,9 +128,8 @@
 
     /* Configure DW1000. See NOTE 6 below. */
     dwt_configure(&config);//配置DW1000
-	
-
-	
+	 dwt_setinterrupt(  DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+ 
     /* Apply default antenna delay value. See NOTE 1 below. */
     dwt_setrxantennadelay(RX_ANT_DLY);		//设置接收天线延迟
     dwt_settxantennadelay(0);		//设置发射天线延迟
@@ -182,10 +182,11 @@
 u8 g_start_sync_flag;
 void SyncPoll(u8 sync_seq,uint32_t sync_baseid)
 {u8 result;
-	g_start_sync_flag=1;   //中断模式,退出终端后,需要重新来过
+	//g_start_sync_flag=1;   //中断模式,退出终端后,需要重新来过
 	dwt_forcetrxoff();   	//关闭接收,以防在RX ON 状态
 	
 	
+	tx_sync_msg[GROUP_ID_IDX] = group_id;
 	tx_sync_msg[SYNC_SEQ_IDX]=sync_seq;
 	memcpy(&tx_sync_msg[ANCHOR_ID_IDX],&sync_baseid,4);
 	dwt_writetxdata(sizeof(tx_sync_msg), tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
@@ -197,6 +198,10 @@
                 { };
 		}
 			 dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清楚标志位
+	//	UART_CheckSend();
+	//dwt_setinterrupt(  DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+		dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+	dwt_rxenable(0);//打开接收
 }
 uint16_t g_Resttimer;
 uint8_t result;
@@ -215,13 +220,13 @@
 u16 nearbaseid_list[MAX_NEARBASE_NUM],mainbase_id,true_nearbase_idlist[MAX_NEARBASE_NUM];
 int32_t mainbase_dist,nearbase_distlist[MAX_NEARBASE_NUM],true_nearbase_distlist[MAX_NEARBASE_NUM],true_exsistbase_list[MAX_NEARBASE_NUM];
 uint8_t trygetnearmsg_times;
-u16 current_slotnum,total_slotnum,target_time,last_time;
+u16 current_slotnum,total_slotnum,target_time,last_time,record_time[10],record_i;
 u32 rec_tagpos_binary;
 extern uint32_t tagpos_binary;
 void SetNextPollTime(u16 time)
 {
 	current_slotnum++;
-	if(current_slotnum==total_slotnum)
+	if(current_slotnum>=total_slotnum)
 		current_slotnum-=total_slotnum;
 	//time=5;
 	target_time=((current_slotnum*g_com_map[COM_INTERVAL])+time);
@@ -238,7 +243,11 @@
 	{target_time-=1000;}
 	if(target_time<0)
 	{target_time+=1000;}
-
+record_time[record_i++]=target_time;
+	if(record_i>=10)
+	{
+		record_i=0;
+	}
 }
 u8 FindNearBasePos(u16 baseid)
 {
@@ -421,7 +430,7 @@
 									memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2);
 									
 									
-									if(g_com_map[DEV_ROLE]!=0)
+									//if(g_com_map[DEV_ROLE]!=0)
 									{
 									sync_timer=temp_sync_timer1;
 ////									memcpy(&tagslotpos,&rx_buffer[TAGSLOTPOS],2);		
@@ -464,10 +473,10 @@
 									dwt_writetxdata(28+nearbase_num*4, tx_nearfinal_msg, 0);//将发送数据写入DW1000
 									dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
 									memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
-								if(temp_dist!=0x1ffff&&g_com_map[ALARM_DISTANCE1] == 1)
+								if(temp_dist!=0x1ffff)
 									{
 										g_Resttimer=0;
-                                        IWDG_Feed();
+                    IWDG_Feed();
 										#ifdef USART_SINGLE_OUTPUT
 										usart_send[2] = 1;//正常模式
 										usart_send[3] = 17;//数据段长度
@@ -485,6 +494,7 @@
 										usart_send[14] = button;
 										checksum = Checksum_u16(&usart_send[2],17);
 										memcpy(&usart_send[19],&checksum,2);
+										if(g_com_map[MODBUS_MODE]!=1)
 										UART_PushFrame(usart_send,21);
 										#endif
 
@@ -516,7 +526,7 @@
 									LED0_BLINK;
 //									memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
 //									tagslotpos=GetRandomSlotPos(rec_tagpos_binary);
-									if(temp_dist!=0x1ffff&&g_com_map[ALARM_DISTANCE1] == 1)
+									if(temp_dist!=0x1ffff)
 									{
 										#ifdef USART_SINGLE_OUTPUT
 										usart_send[2] = 1;//正常模式
@@ -535,6 +545,7 @@
 										usart_send[14] = button;
 										checksum = Checksum_u16(&usart_send[2],17);
 										memcpy(&usart_send[19],&checksum,2);
+										if(g_com_map[MODBUS_MODE]!=1)
 										UART_PushFrame(usart_send,21);
 										#endif
 
@@ -716,6 +727,7 @@
 {
 	//LED0_ON;
 	dwt_forcetrxoff();
+	 dwt_setinterrupt(DWT_INT_TFRS | DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 0);
 		GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);	
 	switch(tag_state)
 	{
@@ -733,12 +745,16 @@
 	SetNextPollTime(tyncpoll_time);
 	g_start_send_flag = 0;		
 	GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_RESET);	
+	UART_CheckSend();
+	dwt_setinterrupt(  DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+		dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+	dwt_rxenable(0);//打开接收
 }
 
 int8_t correction_time,new_tagid=0;
 extern uint8_t sync_seq;
 u16 taglist_num=0,taglist_pos;
-u16 tagid_list[TAG_NUM_IN_SYS];
+u16 tagid_list[TAG_NUM_IN_SYS],tagstate_list[TAG_NUM_IN_SYS];
 u8 tagofflinetime[TAG_NUM_IN_SYS];
 int32_t tagdist_list[TAG_NUM_IN_SYS];
 void TagListUpdate(void)
@@ -862,6 +878,8 @@
  //   min_power =  - 10 * log10((F1 *F1 + F2 * F2 + F3 * F3) / (C *B));
     return min_power;
   }
+u8 testt[100],testt2[100],testt3[100],testt4[100],testt6[100],ti;
+u16 testt5[100];
 u16 smallcar_idlist[10]={0x4052,0x4032,0x4055,0x4034,0x4016,0x4010,0x4036,0x4027,0x4024,0x4047};
 extern u16 dist_threshold;
 u8 misdist_num[TAG_NUM_IN_SYS],seize_anchor,getrange_success=0;
@@ -916,11 +934,11 @@
 			dwt_writetxfctrl(22, 0);//设定发送长度
 			}
 			result = dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);//延迟发送,等待接收
-
+testt2[ti]=frame_seq_nb2;
 			
 			if(result==0)
 			{
-				while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_sync_flag)///不断查询芯片状态直到接收成功或者出现错误
+				while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))///不断查询芯片状态直到接收成功或者出现错误
 			{ };
 		}else{
 			result++;
@@ -928,7 +946,7 @@
 	
 			if (status_reg & SYS_STATUS_RXFCG)//接收成功
 			{
-				
+				testt3[ti]=frame_seq_nb2;
 				dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚标志位
 				frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;//数据长度
 				dwt_readrxdata(rx_buffer, frame_len, 0);//读取接收数据
@@ -977,11 +995,12 @@
                         }
                     
 					g_flag_Taggetdist[taglist_pos]=0;
-                    
+             testt4[ti]=frame_seq_nb2; 
+							testt5[ti] = hex_dist/10;												
 					if(hex_dist>-100000&&hex_dist<2000000)
 					{
 					if(abs(hex_dist-his_dist[taglist_pos])<dist_threshold||misdist_num[taglist_pos]>3)
-					{
+					{u8 i=0;
 						
                         g_Resttimer=0;
                         IWDG_Feed();
@@ -1017,12 +1036,42 @@
 					usart_send[16] = rx_power;
 					checksum = Checksum_u16(&usart_send[2],17);
 					memcpy(&usart_send[19],&checksum,2);
+					if(g_com_map[MODBUS_MODE]!=1)
 					UART_PushFrame(usart_send,21);
+				//USART_puts(usart_send,21);
+					testt6[ti]=frame_seq_nb2; 
+					tagstate_list[taglist_pos] = button<<8|battary;
 				#else		
 					memcpy(&usart_send_anc[4+6*anc_report_num],&tag_id_recv,2);
 					memcpy(&usart_send_anc[6+6*anc_report_num],&tagdist_list[taglist_pos],4);
 					anc_report_num++;
 				#endif
+					for(i=0;i<taglist_num-1;i++)
+					{
+						if( tagdist_list[i]>tagdist_list[i+1]&&tagdist_list[i+1]!=0)
+						{
+							int32_t tempdist;
+							u16 tempid,tempstate;
+							tempdist = tagdist_list[i];
+							tempid = tagid_list[i];
+							tempstate = tagstate_list[i];
+							
+							tagdist_list[i] = tagdist_list[i+1];
+							tagid_list[i] = tagid_list[i+1];
+							tagstate_list[i] = tagstate_list[i+1];
+							
+							tagdist_list[i+1] = tempdist;
+							tagid_list[i+1] = tempid;
+							tagstate_list[i+1] = tempstate;
+						}
+					}
+					for(i=0;i<taglist_num;i++)
+					{
+						Modbus_HoldReg[i*4] = tagid_list[i];
+						Modbus_HoldReg[i*4+1] = tagstate_list[i];
+						memcpy(&Modbus_HoldReg[i*4+2],&tagdist_list[i],4);
+					}
+					
 					}else{
 					//	printf("%d",hex_dist);
 						misdist_num[taglist_pos]++;
@@ -1038,6 +1087,20 @@
 extern u8 flag_syncbase;
 u8 tagpos_rec[50],tagpos_send[50],ancidlist_num;
 u16 ancidlist_rec[20],ancidlist_send[20],rec_ancidlist[20],rec_ancdistlist[20];
+void Anchor_Start(void)
+{
+	
+dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
+	g_start_sync_flag=0;
+dwt_setinterrupt(DWT_INT_TFRS | DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+	dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+	dwt_rxenable(0);//打开接收
+//    while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
+//	{ 
+//		//IdleTask();
+//	};
+}
+
 void Anchor_App(void)
 {
 	
@@ -1045,23 +1108,24 @@
 	u16 tempid;
 	uint32_t rec_syncid;
 	
-	dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
-	g_start_sync_flag=0;
+//	dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
+//	g_start_sync_flag=0;
 
-	dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
-	dwt_rxenable(0);//打开接收
-//	GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);	
-	while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
-	{ 
-		
-		IdleTask();
-	};
+//	dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+//	dwt_rxenable(0);//打开接收
+////	GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);	
+//	while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
+//	{ 
+//		
+//		IdleTask();
+//	};
+	dwt_setinterrupt(DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 0);
+	status_reg = dwt_read32bitreg(SYS_STATUS_ID);
 //GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_RESET);	
 	if (status_reg & SYS_STATUS_RXFCG)//成功接收
 	{ u16 tag_recv_interval;
 		float temp_tagpos;
-	
-
+		
 		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清除标志位
 		frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度
         recpoll_len = frame_len;
@@ -1120,10 +1184,13 @@
 		
 			case NEAR_POLL:	
                 frame_seq_nb2 = rx_buffer[SEQUENCE_IDX];
+			testt[ti++]=frame_seq_nb2;
+			if(ti>100)
+				ti=0;
                 battary = rx_buffer[BATTARY_IDX];
                 button = rx_buffer[BUTTON_IDX];
                 rec_nearbase_num=rx_buffer[NEARBASENUM_INDEX];                
-				memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2);
+								memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2);
                 memcpy(&rec_ancidlist,&rx_buffer[NEARBASEID_INDEX],2*rec_nearbase_num);
                 memcpy(&rec_ancdistlist,&rx_buffer[NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num);
                 memcpy(&rec_antdelay,&rx_buffer[NEARBASEID_INDEX+nearbase_num*4],2);
@@ -1147,8 +1214,7 @@
 				if(taglist_pos==taglist_num)
 				{
 					taglist_pos=taglist_num;
-					tagid_list[taglist_num++]=tag_id_recv;
-					
+					tagid_list[taglist_num++]=tag_id_recv;					
 					new_tagid=1;
 				}else{
 					new_tagid=0;
@@ -1183,9 +1249,13 @@
 				
 				break;		
 		}	
-	}else{
+	}
+}else{
 		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
 	}
-}
+UART_CheckSend();
+	dwt_setinterrupt(  DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
+		dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间
+	dwt_rxenable(0);//打开接收
 }
 

--
Gitblit v1.9.3