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

📄 serial.c

📁 基于avr-gcc (GCC) 4.1.2 (WinAVR 20070525)环境开发的atmega128应用程序(带makefile文件)
💻 C
📖 第 1 页 / 共 2 页
字号:
		&&(isdigit(Serial_0_Data[57])==1))              //x
	{
		x=((uint)(Serial_0_Data[53]-0x30)*1000);
		x+=((uint)(Serial_0_Data[54]-0x30)*100);
		x+=((uint)(Serial_0_Data[55]-0x30)*10);
		x+=(Serial_0_Data[57]-0x30);
		
		LJSJ=x;
		LJSJ_Err=0;
	}
	else
	{
	    LJSJ_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(LJSJ_Err>5)   //超过5次错误,清零
		{
		    LJSJ_Err=0;
			LJSJ=0;
		}
	}
}

/*********************************************/
//函数名称:StartTimerData(void)
//函数功能:起始时间数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void StartTimerData(void)
{
    if((Serial_0_Data[58]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[59])==1)               //M
	    &&(isdigit(Serial_0_Data[60])==1)               //M
		&&(Serial_0_Data[61]==toascii('-'))             //-
	    &&(isdigit(Serial_0_Data[62])==1)               //D
		&&(isdigit(Serial_0_Data[63])==1)               //D
		&&(Serial_0_Data[64]==toascii(' '))             // 
	    &&(isdigit(Serial_0_Data[65])==1)               //H
		&&(isdigit(Serial_0_Data[66])==1)               //H
		&&(Serial_0_Data[67]==toascii(':'))             //:
	    &&(isdigit(Serial_0_Data[68])==1)               //M
		&&(isdigit(Serial_0_Data[69])==1))              //M
	{
		Start_Month=((Serial_0_Data[59]-0x30)*10);
		Start_Month+=(Serial_0_Data[60]-0x30);
		
		Start_Date=((Serial_0_Data[62]-0x30)*10);
		Start_Date+=(Serial_0_Data[63]-0x30);
		
		Start_HH=((Serial_0_Data[65]-0x30)*10);
		Start_HH+=(Serial_0_Data[66]-0x30);
		
		Start_MM=((Serial_0_Data[68]-0x30)*10);
		Start_MM+=(Serial_0_Data[69]-0x30);
		
		QSSJ_Err=0;
	}
	else
	{
	    QSSJ_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(QSSJ_Err>5)   //超过5次错误,清零
		{
		    QSSJ_Err=0;
			
            Start_Month=0;
		    Start_Date=0;
		    Start_HH=0;
		    Start_MM=0;
		}
	}
}

/*********************************************/
//函数名称:BXL_Data(void)
//函数功能:泵效率数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void BXL_Data(void)
{
    uchar x=0;
	
	if((Serial_0_Data[70]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[71])==1)               //x
	    &&(isdigit(Serial_0_Data[72])==1)               //x
		&&(isdigit(Serial_0_Data[73])==1))              //x
	{
		x=((Serial_0_Data[71]-0x30)*100);
		x+=((Serial_0_Data[72]-0x30)*10);
		x+=(Serial_0_Data[73]-0x30);
		
		BXL_1=x;
		BXL_Err=0;
	}
	else
	{
	    BXL_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(BXL_Err>5)   //超过5次错误,清零
		{
		    BXL_Err=0;
			BXL_1=0;
		}
	}
	
	if((Serial_0_Data[74]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[75])==1)               //x
	    &&(isdigit(Serial_0_Data[76])==1)               //x
		&&(isdigit(Serial_0_Data[77])==1))              //x
	{
		x=((Serial_0_Data[75]-0x30)*100);
		x+=((Serial_0_Data[76]-0x30)*10);
		x+=(Serial_0_Data[77]-0x30);
		
		BXL_2=x;
		BXL_Err=0;
	}
	else
	{
	    BXL_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(BXL_Err>5)   //超过5次错误,清零
		{
		    BXL_Err=0;
			BXL_2=0;
		}
	}
}

/*********************************************/
//函数名称:YJ_Type_Data(void)
//函数功能:预警类型数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void YJ_Type_Data(void)
{
	if((Serial_0_Data[78]==toascii(' ')))                //空格
	{
		if(Serial_0_Data[79]==toascii('L'))//井漏  2
		{
		    YJ_Type=2;
		} 
        else
		{
		    if(Serial_0_Data[79]==toascii('Y')) //井涌  3
			{
			    YJ_Type=3;
			}
            else
            {
			    if(Serial_0_Data[79]==toascii('P')) //井喷  1 
				{
					YJ_Type=1;
				}
				else
				{
				    YJ_Type=0;  //正常
				}
			} 
		}
		YJ_Type_Err=0;
	}
	else
	{
	    YJ_Type_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(YJ_Type_Err>5)   //超过5次错误,清零
		{
		    YJ_Type_Err=0;
			YJ_Type=0;
		}
	}
}

/*********************************************/
//函数名称:CLEAR_Data(void)
//函数功能:终端机清零按键操作结果数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void CLEAR_Data(void)
{
    if((Serial_0_Data[80]==toascii(' '))&&(Serial_0_Data[81]==toascii('1'))) //清零成功!
	{
	    CLEAR_Key=0;
//		LJLL=0;           //清累计流量
	}
}

/*********************************************/
//函数名称:GTZJ_Data(void)
//函数功能:钢套直径数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void GTZJ_Data(void)
{
    if((Serial_0_Data[82]==toascii(' ')))                //空格
	{
	    if((isdigit(Serial_0_Data[83])==1)&&
		    (isdigit(Serial_0_Data[84])==1)&&
			(isdigit(Serial_0_Data[85])==1))
		{
		    //读取#1钢套直径数据1
			GT_ZJ1_1=((uint)(Serial_0_Data[83]-0x30)*100+
			         (Serial_0_Data[84]-0x30)*10+
					 (Serial_0_Data[85]-0x30));
		}
	}
	
	if((Serial_0_Data[86]==toascii(' ')))                //空格
	{
		if((isdigit(Serial_0_Data[87])==1)&&
		    (isdigit(Serial_0_Data[88])==1)&&
			(isdigit(Serial_0_Data[89])==1))
		{
		    //读取#1钢套直径数据2
			GT_ZJ1_2=((uint)(Serial_0_Data[87]-0x30)*100+
			         (Serial_0_Data[88]-0x30)*10+
					 (Serial_0_Data[89]-0x30));
		}
	}
	
	if((Serial_0_Data[90]==toascii(' ')))                //空格
	{
		if((isdigit(Serial_0_Data[91])==1)&&
		    (isdigit(Serial_0_Data[92])==1)&&
			(isdigit(Serial_0_Data[93])==1))
		{
		    //读取#1钢套直径数据3
			GT_ZJ1_3=((uint)(Serial_0_Data[91]-0x30)*100+
			         (Serial_0_Data[92]-0x30)*10+
					 (Serial_0_Data[93]-0x30));
		}
	}
	
	if((Serial_0_Data[94]==toascii(' ')))                //空格
	{
		if((isdigit(Serial_0_Data[95])==1)&&
		    (isdigit(Serial_0_Data[96])==1)&&
			(isdigit(Serial_0_Data[97])==1))
		{
		    //读取#2钢套直径数据1
			GT_ZJ2_1=((uint)(Serial_0_Data[95]-0x30)*100+
			         (Serial_0_Data[96]-0x30)*10+
					 (Serial_0_Data[97]-0x30));
		}
	}
	
	if((Serial_0_Data[98]==toascii(' ')))                //空格
	{
		if((isdigit(Serial_0_Data[99])==1)&&
		    (isdigit(Serial_0_Data[100])==1)&&
			(isdigit(Serial_0_Data[101])==1))
		{
		    //读取#2钢套直径数据2
			GT_ZJ2_2=((uint)(Serial_0_Data[99]-0x30)*100+
			         (Serial_0_Data[100]-0x30)*10+
					 (Serial_0_Data[101]-0x30));
		}
	}
	
	if((Serial_0_Data[102]==toascii(' ')))                //空格
	{
		if((isdigit(Serial_0_Data[103])==1)&&
		    (isdigit(Serial_0_Data[104])==1)&&
			(isdigit(Serial_0_Data[105])==1))
		{
		    //读取#2钢套直径数据3
			GT_ZJ2_3=((uint)(Serial_0_Data[103]-0x30)*100+
			         (Serial_0_Data[104]-0x30)*10+
					 (Serial_0_Data[105]-0x30));
		}
	}
}

/*********************************************/
//函数名称:Serial0_Data_Processing(void)
//函数功能:串口0接收数据处理函数
//输入参数:x 
//输出参数:无
//返 回 值:无
/*********************************************/
void Serial0_Data_Processing(void)
{
    uchar addr1,addr2,addr3;
	
	if(Serial_0_ok==1)
	{
	    addr1=((AddrNuber/100)%10+0x30);  //计算本机地址ASCII码
	    addr2=((AddrNuber/10)%10+0x30);
	    addr3=(AddrNuber%10+0x30);
		
		wdt_reset();//喂狗,以免处理中断!
		
		if((Serial_0_Data[1]==toascii('Y'))&&(Serial_0_Data[2]==addr1)&&
			(Serial_0_Data[3]==addr2)&&(Serial_0_Data[4]==addr3)&&
			(Serial_0_Data[5]==toascii('C')))                      //格式为:YXXXC
		{
			BPL_Data();        //泵排量数据提取
			CKYW_Data();       //出口液位数据提取
			CKLL_Data();       //出口流量数据提取
			CKLS_Data();       //出口流速数据提取
			LLC_S_Data();      //流量差(升/秒)数据提取
			LLPL_Data();       //理论排量(升/秒)数据提取
            LJLL_Data();       //累计流量数据提取
            LJSJ_Data();       //累计时间数据提取
			StartTimerData();  //起始时间数据提取
			BXL_Data();        //泵效率数据提取
			YJ_Type_Data();    //预警类型数据提取
			CLEAR_Data();      //终端机清零按键操作结果数据提取
			GTZJ_Data();       //钢套直径数据提取函数
			
			if(ERR_YES_OR_NO!=0)
			{
				Serial0_Err_out();  //串口0接收数据错误回送函数
			}
				
			if(CLEAR_Key!=0)//累计流量清零确认
			{
				put0c(0x0a);    //数据帧开始   
	            put0c(toascii('Y'));
	            put0c((AddrNuber/100)%10+0x30);
	            put0c((AddrNuber/10)%10+0x30);
	            put0c((AddrNuber)%10+0x30);
			    put0c(toascii('B'));
			    put0c(toascii('C'));
			    put0c(toascii('L'));
			    put0c(toascii('E'));
			    put0c(toascii('A'));
			    put0c(toascii('R'));
			    put0c(0x0d);
			}
			
			if((GT_ZJ1_1!=SET_1_GTZJ_Parameter_1)||
			   (GT_ZJ1_2!=SET_1_GTZJ_Parameter_2)||
			   (GT_ZJ1_3!=SET_1_GTZJ_Parameter_3)||
			   (GT_ZJ2_1!=SET_2_GTZJ_Parameter_1)||
			   (GT_ZJ2_2!=SET_2_GTZJ_Parameter_2)||
			   (GT_ZJ2_3!=SET_2_GTZJ_Parameter_3))  //缸套直径参数变更确认
			{
				put0c(0x0a);    //数据帧开始   
	            put0c(toascii('Y'));
	            put0c((AddrNuber/100)%10+0x30);
	            put0c((AddrNuber/10)%10+0x30);
	            put0c((AddrNuber)%10+0x30);
			    put0c(toascii('B'));
			    put0c(toascii(' '));
			    put0c(toascii('G'));
			    put0c(toascii('T'));
			    put0c(toascii('Z'));
			    put0c(toascii('J'));
				put0c(toascii(' '));
				
				put0c((SET_1_GTZJ_Parameter_1/100)%10+0x30);
				put0c((SET_1_GTZJ_Parameter_1/10)%10+0x30);
				put0c((SET_1_GTZJ_Parameter_1)%10+0x30);
				put0c(toascii(' '));
				
				put0c((SET_1_GTZJ_Parameter_2/100)%10+0x30);
				put0c((SET_1_GTZJ_Parameter_2/10)%10+0x30);
				put0c((SET_1_GTZJ_Parameter_2)%10+0x30);
				put0c(toascii(' '));
				
				put0c((SET_1_GTZJ_Parameter_3/100)%10+0x30);
				put0c((SET_1_GTZJ_Parameter_3/10)%10+0x30);
				put0c((SET_1_GTZJ_Parameter_3)%10+0x30);
				put0c(toascii(' '));
				
				put0c((SET_2_GTZJ_Parameter_1/100)%10+0x30);
				put0c((SET_2_GTZJ_Parameter_1/10)%10+0x30);
				put0c((SET_2_GTZJ_Parameter_1)%10+0x30);
				put0c(toascii(' '));
				
				put0c((SET_2_GTZJ_Parameter_2/100)%10+0x30);
				put0c((SET_2_GTZJ_Parameter_2/10)%10+0x30);
				put0c((SET_2_GTZJ_Parameter_2)%10+0x30);
				put0c(toascii(' '));
				
				put0c((SET_2_GTZJ_Parameter_3/100)%10+0x30);
				put0c((SET_2_GTZJ_Parameter_3/10)%10+0x30);
				put0c((SET_2_GTZJ_Parameter_3)%10+0x30);
				
			    put0c(0x0d);
			}
		}
	}
	Serial_0_ok=0;
}

/*********************************************/
//函数名称:SIGNAL(SIG_USART0_RECV)
//函数功能:串口0中断接收处理函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
SIGNAL(SIG_USART0_RECV)
{
    uchar Temp;
	
	Temp=UDR0;     //接收数据!
	Run_Cn=0;
put1c(Temp);
    if(Temp==0x0a)   //判断是否为数据帧开始
	{
	    rece_Len_0=0;       //串口0接收数据长度=0
	    recebuf_0[0]=Temp;
	    rece_Len_0++;       //串口0接收数据长度+1
	}
	else
	{
		if(rece_Len_0>106){rece_Len_0=0;}
		recebuf_0[rece_Len_0]=Temp;
		rece_Len_0++;
	}
	
	if((Temp==0x0d)&&(recebuf_0[0]==0x0a))//判断数据帧是否结束
	{
		if(recebuf_0[106]==0x0d)
		{
		    for(rece_Len_0=0;rece_Len_0<106;rece_Len_0++)
		    {
			    Serial_0_Data[rece_Len_0]=recebuf_0[rece_Len_0];   //转存串口0接收的数据,等待处理!
			    recebuf_0[rece_Len_0]=0;                           //清接收缓存
		    }
	        Serial_0_ok=1;   //串口0接收数据完成
		}
		else
		{
		    StaraEnd_Err=1;     //起始帧或结束帧错误!       错误编码:11
			ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
			Serial0_Err_out();  //串口0接收数据错误回送函数
		}
	}
	wdt_reset();//喂狗,以免退出复位
}

/*********************************************/
//函数名称:SIGNAL(SIG_USART0_RECV)
//函数功能:串口1中断接收处理函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
SIGNAL(SIG_USART1_RECV)
{
    uchar Temp;
	
	Temp=UDR1;     //接收数据!
	
	put1c(0x0a);
	put1c(0xB6);
	put1c(0xCB);
	put1c(0xBF);
	put1c(0xDA);
	put1c(0xB4);                            
	put1c(0xED);
	put1c(0xCE);
	put1c(0xF3);
	put1c(0xA3);
	put1c(0xA1);
	put1c(0xD5);	put1c(0xE2);	put1c(0xCA);	put1c(0xC7);	put1c(0xB6);	put1c(0xCB);	put1c(0xBF);	put1c(0xDA);	put1c(0x31);	put1c(0xA3);
	put1c(0xAC);
	put1c(0xC7);
	put1c(0xEB);
	put1c(0xB8);
	put1c(0xC4);	put1c(0xBD);	put1c(0xD3);
	put1c(0xB6);
	put1c(0xCB);
	put1c(0xBF);
	put1c(0xDA);
	put1c(0x30);
	put1c(0xA3);
	put1c(0xA1);
	put1c(0x0d);
    wdt_reset();//喂狗,以免退出复位
}

⌨️ 快捷键说明

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