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

📄 spr_ri080526.c

📁 基于F020的UART,232通讯例程代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	   ansbuf[5] = XPLESL;
       }
    else
       {
	   ansbuf[4] = 0xff;
	   ansbuf[5] = 0xff;
       }
    ansbuf[6] = 0;
    ansbuf[7] = XBRIGHT;
    ansbuf[8] = 0;
    ansbuf[9] = XTIME;
    ansbuf[10] = XVOLTH;
    ansbuf[11] = XVOLTL;

    for(i=0; i<12; i++)
       {
	   check  = check ^ ansbuf[i];
	   TI0 = 0;
	   SBUF0 = ansbuf[i];
	   while(TI0 == 0);
       }
    ansbuf[12] = check;
    TI0 = 0;
    SBUF0 = check;
    while(TI0 == 0);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//最优化设定
///////////////////////////////////////////////////////////////////////////////////////////////
void OptimSet(void)
{
    XPLESH = rebuf[6];
    XPLESL = rebuf[7];
    XBRIGHT = rebuf[9];
    XTIME = rebuf[11];
    XCOUNT = rebuf[13];
    FlashWrite();
}
///////////////////////////////////////////////////////////////////////////////////////////////
//测量暗背景
///////////////////////////////////////////////////////////////////////////////////////////////
void BeginBkdark(void)
{
    bright = 0;
    time = XTIME;  			//积分时间
    count = XCOUNT;		//平均测量次数
    Measure(XBKaddr);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//测量空气背景
///////////////////////////////////////////////////////////////////////////////////////////////
void BeginBkair(void)
{
    bright = XBRIGHT;			//LED亮时测量Ia
    time = XTIME;			//积分时间
    count = XCOUNT;		//平均测量次数
    Measure(XAIRaddr);	

    bright = 0;				//LED暗时测量Ib
    time = XTIME;			//积分时间
    count = XCOUNT;		//平均测量次数
    Measure(XBKaddr);

    Sub(XAIRaddr,XBKaddr,XAIRaddr);	//Ia-Ib,结果存放在XAIRaddr	       
}
///////////////////////////////////////////////////////////////////////////////////////////////
//单次采样(sa-sb)
///////////////////////////////////////////////////////////////////////////////////////////////
void BeginSingle(void)
{
    bright = XBRIGHT;			//LED亮时测量Sa
    time = XTIME;			//积分时间
    count = XCOUNT;		//平均测量次数
    Measure(XORGaddr);	

    bright = 0;				//LED暗时测量Sb
    time = XTIME;			//积分时间
    count = XCOUNT;		//平均测量次数
    Measure(XSIGaddr);

    Sub(XORGaddr,XSIGaddr,XSIGaddr);	//Sa-Sb,结果存放在XSIGaddr	

}
//////////////////////////////////////////////////////////////////////////////////////////////
//命令继续振接收函数
//功能:接收n个字节的命令帧
//输入:需要继续接收几个字节n
//输出:无
////////////////////////////////////////////////////////////////////////////////////////////// 
void Con_receive(unsigned int n)
{	
 unsigned char data endflag = 0;
 time = XTIME;
 count = XCOUNT;
 TI0 = 0;	                              //T0清零
 ES0 = 1;                               //允许UART0中断
 uartrecnum = 4;						//已经接收了4个字节rebuf[0]-rebuf[3]

 while(endflag == 0)
	{
	bright = XBRIGHT;
	Measure(XORGaddr);
	bright = 0;
	Measure(XSIGaddr);
	Sub(XORGaddr,XSIGaddr,XSIGaddr);
	if (uartrecnum == n+4) 
		 endflag = 1;
	}
 ES0 = 0; 							  //禁止UART0中断
}

//////////////////////////////////////////////////////////////////////////////////////////////
//命令分析函数
//功能:分析从上位机串口接收到的命令
//输入:无
//输出:无
////////////////////////////////////////////////////////////////////////////////////////////// 
void commend_analys()
{
 unsigned char data check,i;
 Num50ms_R=0;
 Num1s_R=0;
 //WorkFlag=0;					//清除各类标志
 //TimingIni_F=0;
 //SetTime_F=0;
 InwaterTime_F=0;
 InsampleTime_F=0;
 CleanTime_F=0;	
 TR2=0;	

 for (i=0;i<4;i++)					//接收命令前4个字节
	{		
	while (RI0 == 0);
	rebuf[i]=SBUF0;
	RI0=0;
	}
 switch (rebuf[3])
 {
 case 0x30:					//查询版本号
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		CheckVersion();
//		trytime();
    break;

 case 0x51:					//开始最优化测量
	check=0x00;
	Con_receive(15);			//根据通信规约
	for (i=0;i<18;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[18])) 
		senderror();
	else
		{
		SendResponse();
		BeginOptim();
		}
    break;

 case 0x52:					//查询最优化结果
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		{		
		OptimResult();
		}
    break;

 case 0x53:					//最优化设定
	check=0x00;
	Con_receive(15);			//根据通信规约
	for (i=0;i<18;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[18])) 
		senderror();
	else
		{
		SendResponse();
		OptimSet();	
		}
    break;

 case 0x61:					//测量背景
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		{
		SendResponse();
		BeginBkdark();
		}
    break;

 case 0x62:					//查询测量背景结果
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		{
		UploadData(XBKaddr);
		}
    break;

 case 0x71:					//测量空气背景
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		{
		SendResponse();
		BeginBkair();
		}
    break;

 case 0x72:					//查询测量空气背景结果
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		{
		UploadData(XAIRaddr);	
		}
    break;

 case 0x81:					//单次采样
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		{
		SendResponse();
		BeginSingle();		
		}
    break;

 case 0x82:					//查询单次采样结果,并回送数据
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else
		{
		UploadData(XSIGaddr);			
		}
    break;

 case 0x91:					//单次测量命令
	check=0x00;
	Con_receive(19);			//根据通信规约
	for (i=0;i<22;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[22])) 
		senderror();
	else
		{
		SendResponse();
		single_measure(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9],rebuf[10]*256+rebuf[11],rebuf[12]*256+rebuf[13],rebuf[14]*256+rebuf[15],rebuf[16]*256+rebuf[17]);
		}
    break;

 case 0x93:					//连续测量命令
	check=0x00;
	Con_receive(19);			//根据通信规约
	for (i=0;i<22;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[22])) 
		senderror();
	else
		{
		SendResponse();
		continue_measure(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9],rebuf[10]*256+rebuf[11],rebuf[12]*256+rebuf[13],rebuf[14]*256+rebuf[15],rebuf[16]*256+rebuf[17]);
		}
    break;

 case 0x94:					//进水调试测量命令
	check=0x00;
	Con_receive(9);			//根据通信规约
	for (i=0;i<12;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[12])) 
		senderror();
	else
		{
		SendResponse();
		wateradjust_measure(rebuf[6]*256+rebuf[7]);
		}
    break;

 case 0x95:					//进样调试测量命令
	check=0x00;
	Con_receive(9);			//根据通信规约
	for (i=0;i<12;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[12])) 
		senderror();
	else
		{
		SendResponse();
		sampleadjust_measure(rebuf[6]*256+rebuf[7]);
		}
    break;

/*
 case 0x96:					//定时测量命令
	check=0x00;
	Con_receive(26);			//根据通信规约
	for (i=0;i<29;i++)		//计算校验位
		check=check^rebuf[i];
	if (check!=(rebuf[29])) 
		senderror();
	else
		{
		//根据上位机的时钟计算Gap的值
		GapTime_R=Gap_Calculation(rebuf[21],rebuf[22]);				
		if (GapTime_R > 30)
			single_measure(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9],rebuf[10]*256+rebuf[11],rebuf[12]*256+rebuf[13],rebuf[14]*256+rebuf[15],rebuf[16]*256+rebuf[17]);
		}
    break;
*/
 case 0x98:					//清洗命令
	check=0x00;
	Con_receive(7);			//根据通信规约
	for (i=0;i<10;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[10])) 
		senderror();
	else
		{	
		SendResponse();
		clean(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9]);
		}
    break;

 case 0xF0:					//终止命令
	check=0x00;
	Con_receive(3);			//根据通信规约
	for (i=0;i<6;i++)
		check =check^rebuf[i];
	if (check!=(rebuf[6])) 
		senderror();
	else SendResponse();
    break;

 }

}

//////////////////////////////////////////////////////////////////////////////////////////////
//单次测量函数
//功能:
//输入:V1,T1进水的速度和时间;V2,T2进样速度和的时间;V3,T3清洗的速度和时间
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////  
void single_measure(unsigned int V1,unsigned int T1,unsigned int V2,unsigned int T2,unsigned int V3,unsigned int T3)
{
 time = XTIME;
 count = XCOUNT;
  
 InwaterTime_R=T1;		//设置各步操作所需的时间
 InsampleTime_R=T2;
 CleanTime_R=T3;

 RI0=0;
 TR2=1;					//打开定时器2

 if(RI0==0)
	{
	sendsignal(0x55,rebuf[6],rebuf[7],rebuf[8],rebuf[9],0x00);
	Valve_Switch(1);		//切换阀门
 	PCA0CPH0=V1;			//设置进水的速度
 	CR=1;				  //启动蠕动泵
	} 
 while ((InwaterTime_F==0)&&(RI0==0)) 
 	{
	bright = XBRIGHT;
	Measure(XORGaddr);	//测量原始信号
	bright = 0;
	Measure(XSIGaddr);  //测量背景信号
	Sub(XORGaddr,XSIGaddr,XSIGaddr);
	UploadData(XSIGaddr);
	}
 CR=0;
// delay(20); 
 if(RI0==0)
 	{
 	sendsignal(0xff,rebuf[10],rebuf[11],rebuf[12],rebuf[13],0x88);
	Valve_Switch(2);		//切换阀门
 	PCA0CPH0=V2;			//设置进水的速度
 	CR=1;					//启动蠕动泵
	}


 while ((InsampleTime_F==0)&&(RI0==0)) 	
 	{
	bright = XBRIGHT;
	Measure(XORGaddr);	//测量原始信号
	bright = 0;
	Measure(XSIGaddr);  
	Sub(XORGaddr,XSIGaddr,XSIGaddr);
	UploadData(XSIGaddr);
	}	
 CR=0;
//delay(20); 
 if(RI0==0)
 	{
 	sendsignal(0x55,rebuf[14],rebuf[15],rebuf[16],rebuf[17],0x88);
	Valve_Switch(1);
 	PCA0CPH0=V3;			//设置进水的速度
 	CR=1;					//启动蠕动泵
	}
 while((CleanTime_F==0)&&(RI0==0)) 	
 	{
	bright = XBRIGHT;
	Measure(XORGaddr);	//测量原始信号
	bright = 0;
	Measure(XSIGaddr);  
	Sub(XORGaddr,XSIGaddr,XSIGaddr);
	UploadData(XSIGaddr);
	}
 CR=0;
 TR2=0;
 RI0 = 0; 			//软件清除标志位
 sendsignal(0,0,0,0,0,0xff);
 //delay(20);
}

//////////////////////////////////////////////////////////////////////////////////////////////
//连续测量函数
//功能:
//输入:V1,T1进水的速度和时间;V2,T2进样速度和定时清洗的时间间隔;V3,T3清洗的速度和时间
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////  
void continue_measure(unsigned int V1,unsigned int T1,unsigned int V2,unsigned int T2,unsigned int V3,unsigned int T3)
{ 
 unsigned char data continend_F;

 time = XTIME;
 count = XCOUNT;

 continend_F=1;			//连续测量结束标志
 InwaterTime_R=	T1;		//保存进水时间
 InsampleTime_R=T2;		//保存定时清洗的时间常数
 CleanTime_R=T3;		//清洗时间
 RI0 = 0;
 TR2=1;					//打开定时器?

 if(RI0==0)

⌨️ 快捷键说明

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