⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sl.c

📁 7941916tc35i-SMS_Mcu_Program.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
	else if (STI)
	{													// If Transmit Complete:
		STI = 0;										// Clear transmit flag.
		if (Ini_Data_Num_Send<23)						// If less than 15 characters transmitted:
		{                          
			STXBSY = 1;									// Claim SW_UART Transmitter.
			TDR = *(Ini_Data_BufferPoint+Ini_Data_Num_Send);
			Ini_Data_Num_Send++;						// Increment variable, transmit.
			CCF1 = 1;									// Force module 0 interrupt to initiate TX
		}										         
		else 
		{
			Ini_Data_Num_Send=0;
		}	
		Ini_Data_Flag=0;		
	}
}

//--------------------------------------------------------------
//WAVECOM 数据接收子程序:串口0中断服务程序
 
void  Serial0_WAVECOM(void)   interrupt 4

{   
    EA=0;
	if (RI0)	
	{	 
		RI0=0;
		if(RECEIVE_FLAG==0)
		{
			if(SBUF0==0x7E)
			{
				RECEIVE_FLAG=1;
				RECEIVEBUFFERPOINT=RECEIVEBUFFER;
				WAVE_Receive_Num = 0;
			}
        }
		else
		{
			if(SBUF0==0x7E)
			{ 
			  if(RECEIVEBUFFERPOINT!=RECEIVEBUFFER)     //排除连续收到两个7E,数据长度为0的错误情况
				 {
				  RECEIVE_FLAG=0;
				  PPP_Rec_Complete = 1;
                 }
			}
			else
			{
				if(PADDING_Flag==1)
	  			{
	  				*RECEIVEBUFFERPOINT=SBUF0;
	  	        	*RECEIVEBUFFERPOINT^=0x20;
	  	        	PADDING_Flag=0;
	  	        	RECEIVEBUFFERPOINT++;
					WAVE_Receive_Num++;
	    		}
	    		else
	    		{
	    			if(SBUF0==0x7D)
	    				PADDING_Flag=1;
	    			else
	    			{
	    				*RECEIVEBUFFERPOINT=SBUF0;
	  	           		RECEIVEBUFFERPOINT++;
						WAVE_Receive_Num++;
	  	        	}
	  	        }
			}
		}
   	}

    EA=1;
}
//-------------------------------------------------------------
//-------------------------------------------------------------

// 采集板数据接收子程序:串口1中断服务程序

// Head_Flag=0x0E	End_Flag=0x05  0x0A means 0x7D 
// when x<0x10  ,x= 0x7D x^0x10
	
void  Serial1_CaiJi(void)  interrupt 20
{		
	if((SCON1 & 0x01)!=0x00){ 

		SCON1 &= 0xFE; 					// 清串口1标字位					
		if(SBUF1==0x0E){				// 接收帧头

			Receive_Flag_UART1=1;
			CAIJI_Receive_Len = 0;
		}			
		else{

			if(Receive_Flag_UART1==1){
							
				if(SBUF1==0x05){
					Receive_Flag_UART1=0;
					Padding_Flag_UART1=0;
				 	UART1_Rec_Complete=1;
				}
				else if(Padding_Flag_UART1==1){
					Padding_Flag_UART1=0;
					Receive_Buf_UAR1[CAIJI_Receive_Len] = SBUF1;
	  	        	Receive_Buf_UAR1[CAIJI_Receive_Len] ^= 0x7D;
	  	        	CAIJI_Receive_Len++;
				}
				else if(SBUF1==0x7D){
					Padding_Flag_UART1=1;
				}
				else if(SBUF1==0x0A){
					Receive_Buf_UAR1[CAIJI_Receive_Len] = 0x7D;
					CAIJI_Receive_Len++;
				}
				else{
					Receive_Buf_UAR1[CAIJI_Receive_Len] = SBUF1;
					CAIJI_Receive_Len++;
				}							
			}
		}
	}						
}				


// 定时发送测试帧子程序 :外部中断0
void TestNetwork(void) interrupt 0 
{
   	unsigned char xdata temp1;
	unsigned char xdata temp2;
	
	Timer_Num++;

	// 测试间隔到否
	CS_RTC = 1;
	if(Timer_Num == XBYTE[StartAddress + Time_Interval])
	{
		if(Test_Frame_Answer == 1)
		{
			WDTCN = 0xa5; // 重启
		}

		else 
		{
			Send_Test_Frame = 1;
			Test_Frame_Answer = 1;
			Timer_Num = 0;
		}
	}
	CS_RTC=0;读时钟芯片的寄存器C
	temp1 = RegC; //,用于中断标志位清0
	
	while(RegA & 0x80 != 0x00);	
	temp1 = Hour;
	temp2 = Minute;
	CS_RTC=1; 

	//测试定时采集到否
	if((temp1 == XBYTE[StartAddress+UP_Send_Time]) && (temp2 == XBYTE[StartAddress+UP_Send_Time+1]))
	{
		Timer_Gather_Flag = 1;
	}
}  
								
// -------------------------------------------------------------------
// 外部FLASH处理程序代码		

//擦除FLASH子程序

void Erase_Chip(void)
{
	unsigned int i,j;


	Address5555=0xAA;
	Address2AAA=0x55;
	Address5555=0x80;
	Address5555=0xAA;
	Address2AAA=0x55;
	Address5555=0x10;
	for(i=0;i<1000;i++) for(j=0;j<1000;j++);
	
}	

//擦除FLASH扇区子程序

void Erase_Sector(unsigned int w_address)
{
	unsigned int i,j;
	Address5555=0xAA;
	Address2AAA=0x55;
	Address5555=0x80;
	Address5555=0xAA;
	Address2AAA=0x55;
	XBYTE[w_address]=0x30;
	for(i=0;i<100;i++) for(j=0;j<1000;j++);
	
}	

//写FLASH操作子程序

void Write_Byte(unsigned int w_address, unsigned char w_byte)
 {
 	unsigned int i;
 	CS_RTC=1;
	Address5555=0xAA;
	Address2AAA=0x55;
	Address5555=0xA0;
	XBYTE[w_address]=w_byte;
	for(i=0;i<1000;i++);             //for(i=0;i<10000;i++);             减少10倍
	CS_RTC=0;
}

// ------------------------------------------------------------------
// ------------------------------------------------------------------

// 应用程序校验代码
void CHECKSUM_UDP(unsigned int Data_length)
{
	unsigned char  i;
	long sum;
	unsigned char xdata Temp_Buffer[350];

	sum = cksum(IP_Head,20);
    IP_Head[10] = ((sum >> 8) & 0x00ff);
    IP_Head[11] = (sum & 0x00ff);             		// least significant byte first

    for(i=0;i<8;i++) Temp_Buffer[i] = IP_Head[i+12];

    Temp_Buffer[8] = 0x0;
    Temp_Buffer[9] = IP_Head[9];
    Temp_Buffer[10] = UDP_Head[4];
    Temp_Buffer[11] = UDP_Head[5];

    for(i=0;i<8;i++) Temp_Buffer[i+12] = UDP_Head[i];
	for(i=0;i<Data_length;i++)Temp_Buffer[i+20] = WAVE_Command_Buf[i];
    sum = cksum(Temp_Buffer,20+Data_length);
    UDP_Head[6] = ((sum >> 8) & 0x00ff);
    UDP_Head[7] = (sum & 0x00ff);             // least significant byte first

}

//-------------------------------------------------------------------------------------------------------
long cksum(unsigned char *ip, int len)
{

       register long sum = 0;

        while( len > 1 )
        {
               sum += *((unsigned short *)ip)++;
               len -= 2;
       	}

       if( len > 0 )
               sum += *(unsigned char *)ip;

       while (sum>>16)
           sum = (sum & 0xffff) + (sum >> 16);

       return ~sum;
}

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

// 应用程序段

void SEND_DATA_WAVECOM(unsigned int data_len)
{
	unsigned int i;
	unsigned char xdata Temp_Buffer[400];
	unsigned int buffer_len=0;

	/*

	// 网络不同且没经过初始化,不允许发数据
	if((GPRS_OK !=1) || (Init_Flag != 1))
	{
		return;
	}

	// 如为奇数后面补0
	i = data_len%2;
	if(i!=0)
	{
		WAVE_Command_Buf[data_len] = 0;
		data_len++;
	}
*/
	*( unsigned int xdata *)(IP_Head+2)=28+data_len;	// write total length to IP head 
	IP_Head[10]=IP_Head[11]=0x00;						// clear check_sum buffer in IP_HEAD

	*(unsigned int xdata *)(UDP_Head+4)=8+data_len;		// write UDP length to UDP head
	UDP_Head[6]=UDP_Head[7]=0x00;						// clear check_sum buffer in UDP_HEAD

	Frame_End[0]=Frame_End[1]=0x00;						// clear FCS buffer 
	CHECKSUM_UDP(data_len);

	for(i=0;i<2;i++)  Temp_Buffer[buffer_len++] = Frame_Head[i];
	for(i=0;i<20;i++) Temp_Buffer[buffer_len++] = IP_Head[i];
	for(i=0;i<8;i++)  Temp_Buffer[buffer_len++] = UDP_Head[i];
	for(i=0;i<data_len;i++)	Temp_Buffer[buffer_len++] = WAVE_Command_Buf[i];
	for(i=0;i<3;i++)  Temp_Buffer[buffer_len++] = Frame_End[i];
	
	Fcs16(Temp_Buffer,buffer_len);						// create FSC and write to buffer
	
	for(i=0;i<11;i++)									// send data to UART0
	{
		TI0 = 0;
       	SBUF0 = Temp_Buffer[i];
       	while(TI0==0); TI0 = 0;
	}
	
	SBUF0 = 0x7D;
	while(TI0==0);TI0=0;
	SBUF0 = 0x31;
	while(TI0==0);TI0=0;
	for(i=12;i<buffer_len-1;i++)
	{
		if(Temp_Buffer[i] == 0x7E){
			SBUF0 = 0x7D;
			while(TI0==0);TI0=0;
			SBUF0 = 0x5E;
			while(TI0==0);TI0=0;
		}
		else if(Temp_Buffer[i] == 0x7D){
			SBUF0 = 0x7D;
			while(TI0==0);TI0=0;
			SBUF0 = 0x5D;
			while(TI0==0);TI0=0;
		}
	/*	else if(Temp_Buffer[i]< 0x20){			
			SBUF0 = 0x7D;
			while(TI0==0);TI0=0;
			SBUF0 = Temp_Buffer[i]^0x20;
			while(TI0==0);TI0=0;
		}*/
		else{
			SBUF0 = Temp_Buffer[i];
			while(TI0==0);TI0=0;
		}
	}

	SBUF0 = 0x7E;
	while(TI0==0);TI0=0;	
	
}


// 向采集板发送子程序
void SEND_DATA_CAIJI(unsigned char Data_Len)
{
	unsigned char i;
	unsigned char checksum=0;

	for(i=0;i<Data_Len;i++)
	{
		checksum = checksum + CAIJI_Command_Buf[i];
	}
	
	CAIJI_Command_Buf[Data_Len] = checksum;
	SCON1 &=0xFD;
	SBUF1 = 0x0E;									// 发送帧头
	while(TI1==0); SCON1 &= 0xFD;

	for(i=0;i<Data_Len+1;i++)							// 发送数据
	{
		if(CAIJI_Command_Buf[i] == 0x7D)
		{
			SBUF1 = 0x0A;
			while(TI1==0); SCON1 &=0xFD;
		}
		else if(CAIJI_Command_Buf[i]<0x10)
		{
			SBUF1 = 0x7D;
			while(TI1==0); SCON1 &=0xFD;
			SBUF1 = CAIJI_Command_Buf[i]^0x7D;
			while(TI1==0); SCON1 &=0xFD;
		}
		else 
		{
			SBUF1 = CAIJI_Command_Buf[i];
			while(TI1==0); SCON1 &=0xFD;
		}
	}

	SBUF1 = 0x05;									// 发送帧尾
	while(TI1==0); SCON1 &=0xFD;
}

// 采集板送来数据处理子程序

void DEAL_DATA_CAIJI(void)
{
	unsigned int i;
	unsigned char check_sum=0;

	for(i=0;i<CAIJI_Receive_Len-1;i++)
	{
		CAIJI_Data_Buffer[i] = Receive_Buf_UAR1[i];		// 保存数据到数据缓存区
		check_sum =	check_sum + Receive_Buf_UAR1[i];	// 计算校验和
	}

	if(check_sum !=  Receive_Buf_UAR1[CAIJI_Receive_Len-1])	// 校验校验和
	{
		return;
	}
	// 数据传输正确,进行处理
	CAIJI_Data_Len = CAIJI_Receive_Len - 1;

	switch(CAIJI_Data_Buffer[1])
	{
		case	0xAA:								// 应答代码
			switch(CAIJI_Data_Buffer[2])
			{
				case	0x10:
					// 普通命令应答处理
					if(CAIJI_Data_Buffer[0] != (CAIJI_Send_SeqNr-1))	
					{
						return;								// 序列号不匹配,不作处理
					}

					// 停止向采集板命令重传
					CAIJI_Resend_Flag = 0;					
					CAIJI_Timer = 0;
					if(WAVE_Resend_Flag == 0)
					{
						TMR3CN &=0xFB;	// 关闭定时器3					
					}
					break;

				case	0x20:
					// 采集数据处理
					Frame_Data_Deal();
					break;
			}											
		case	0x55:
			switch(CAIJI_Data_Buffer[2])
			{
				case	0x00:
					Trouble_Inform_Comm();		// 故障通知命令
					break;
				case	0x01:
					Data_Ready_Comm();			// 数据准备好命令
					break;
			}
	}
	
}

// 采集板送来的帧处理
void Frame_Data_Deal(void)
{
	unsigned int i;
	unsigned int address;

	// 判断序列号
	if(CAIJI_Data_Buffer[0] != CAIJI_Send_SeqNr-1 )	
	{
		return;								
	}

	// 判断帧序号
	if(CAIJI_Data_Buffer[5] != Frame_Num)
	{
		return;
	}

	// 判断帧长度
	if(CAIJI_Data_Buffer[3]>245)
	{
		return;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -