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

📄 slave.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 5 页
字号:
				}				
			}
        }
	}
	FlagWsSend[n-1] = 1;   //用来标识发送的数据采集命令后,返回的数据已经被处理,可以发送下一个外设的数据采集命令了。
}

/***********************************************************************************************************
功能:Process7053RecvData,打包7053的外设数据。
描述:当外设为7053,且FlagProcessRecvData==1时,调用该函数来打包外设7053的数据,并且保存在相应的存储器中。
参数:wsaddress---外设编号
返回:无
************************************************************************************************************/
void Process7053RecvData(uchar wsaddress)
{
    uchar j,len; //j通道值
	uchar Temp1,Temp2,Temp3,Temp4,Output;
	uint  Temp;  //7053的暂存变量
	uint Max,Min,TempL;	
	uint length;
	uint address1;  //原来的外设的最大最小等信息的存储地址
	uint address2;  //从机的数据存储地址 ; 	
	uint address3;  //报警值存储地址
	xdata uchar TempBuff[WsChannelParaLen];
	xdata uchar TiJiaoDataBuff[7];
	Temp1=RecvDataBuff[0]; //保存15-12位数据
    Temp2=RecvDataBuff[1]; //保存11-8位数据
	Temp3=RecvDataBuff[2]; //保存7-4位数据
    Temp4=RecvDataBuff[3]; //保存3-0位数据

	if((Temp1 >= 0x30) && (Temp1 <= 0x39)) //如果0=<Temp1=<9
	{
	   Temp1 = Temp1 - 0x30;
	}
	else if(((Temp1 >= 0x40) && (Temp1 <= 0x46))) //如果A=<Temp1=<F
	{
	  Temp1 = Temp1 - 0x40 + 9;
	}

	if((Temp2 >= 0x30) && (Temp2 <= 0x39)) //如果0=<Temp2=<9
	{
	   Temp2 = Temp2 - 0x30;
	}
	else if(((Temp2 >= 0x40) && (Temp2 <= 0x46))) //如果A=<Temp2=<F
	{
	  Temp2 = Temp2 - 0x40 + 9;
	}

	if((Temp3 >= 0x30) && (Temp3 <= 0x39)) //如果0=<Temp3=<9
	{
	   Temp3 = Temp3 - 0x30;
	}
	else if(((Temp3 >= 0x40) && (Temp3 <= 0x46))) //如果A=<Temp3=<F
	{
	  Temp3 = Temp3 - 0x40 + 9;
	}

	if((Temp4 >= 0x30) && (Temp4 <= 0x39)) //如果0=<Temp4=<9
	{
	   Temp4 = Temp4 - 0x30;
	}
	else if(((Temp4 >= 0x40) && (Temp4 <= 0x46))) //如果A=<Temp4=<F
	{
	  Temp4 = Temp4 - 0x40 + 9;
	}

	TempL = Temp4 + Temp3 * 0x10 + Temp2 * 0x100 + Temp1 * 0x1000; //求出16个通道的数值,用16位数表示

	for( j=Channel1;j<=Channel16;j++)
	{
		Temp=(TempL&0x0001);  //先处理低通道,判断时候为0.

		if( Temp == 0)  //若为0
		{
		  Temp = 0x00;  //表示外设开关关闭
		}
		else            //若不为0
		{
		  Temp = 0xFF;  //表示外设开关关闭悬空
		}
        address1=Ws1channel1 +(wsaddress-1)* 0x100+ j * 0x10; //计算通道j的参数保存地址
		MyReadBytes(address1,TempBuff,WsChannelParaLen); 
        //取出通道j的参数 最大整数,最大小数,最小整数,最小小数,超高报警高,超高报警低,超低报警高,超低报警低,使能,超高报警动作号,超低报警动作号。
        if(1/*TempBuff[8]*/)                 //使能位为1,提交数据包
		{
			TiJiaoDataBuff[0]=StartFlag;     //包开始标识
            TiJiaoDataBuff[1]=CmdSendSlave;  //包标识
            TiJiaoDataBuff[2]=SlaveCode;     //从机编号
            TiJiaoDataBuff[3]=wsaddress;     //外设编号
            TiJiaoDataBuff[4]=j;             //通道编号
            TiJiaoDataBuff[5]=Temp;          //通道数据
            TiJiaoDataBuff[6]=Temp;          //通道数据

            length=GetMyDataBytes(MyDataLenAdd);    //取出当前已保存的数据长度,用来计算下一次的保存地址。
			if((length + 7) > DataLen7053)
			{
			   address2 = MyDataStart;
			   MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave);      //以数据包的形式存储到存储器。
			   MyWriteOneByte(MyDataLenAdd,(DataLen7053%256));            //设置新的数据长度。
			   MyWriteOneByte(MyDataLenAdd+1,(DataLen7053/256));          //设置新的数据长度。
			}
			else
			{
			   address2 = MyDataStart + length;                       //计算保存的地址。
               MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave);  //以数据包的形式存储到存储器。
               SetMyDataBytes(MyDataLenAdd,LenCmdSendSlave);          //设置新的数据长度。
			}
                                       
            Max=TempBuff[0];    //是否报警
		    Min=TempBuff[2];   
 
			if(TempBuff[3] == 0x01)  //如果该通道常开
			{
			   if(Temp == 0x00)      //如果该通道常开,而通道返回数据闭合了则发出超低报警!
			   {
                  Output = TempBuff[10];
				  if(Output != 0xFF)
				  {
				     len=MyReadOneByte(WsAlarmLen);
			         address3=WsAlarm + len ;
                     MyWriteOneByte(address3,Output);
			         MyWriteOneByte(WsAlarmLen,len+1);
				  }				  
			   }
			}
			else if(TempBuff[3] == 0x00) //如果该通道常闭
			{
			   if(Temp == 0xFF)          //如果该通道常闭,而通道返回数据断开了则发出超高报警!
			   {
                  Output = TempBuff[9];
				  if(Output != 0xFF)
				  {
				     len=MyReadOneByte(WsAlarmLen);
			         address3=WsAlarm + len;
                     MyWriteOneByte(address3,Output);
			         MyWriteOneByte(WsAlarmLen,len+1);
				  }				  
			   }
			}
                
            TempL = (TempL>>1); //右移一位
        }
	}
	FlagWsSend[n-1] = 1;  //用来标识发送的数据采集命令后,返回的数据已经被处理,可以发送下一个外设的数据采集命令了。
}


/***********************************************************************************************************
功能:CopyToComRam,把自带RAM里面的数据拷贝到公共RAM区域里面.
描述:实现把自己自带RAM里面的数据通过缓冲区CopyBuff[COPYLEN]拷贝到公共RAM区域里面,如果长度不超过缓冲区长度就
     一次拷贝过去,假如长度超过缓冲区长度就分几次拷贝过去。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度 
返回:无
************************************************************************************************************/
void CopyToComRam(uint address1,uint address2,uint length)
{
   xdata uchar CopyBuff[COPYLEN];   //缓冲区数组。
   uchar i,len1,len2;
   len1=(uchar)(length / COPYLEN);  //拷贝的次数。
   len2=(uchar)(length % COPYLEN);  //拷贝的余数。

	if(length>0)                    //验证length的有效性。
	{
		 if(length>COPYLEN)         //length大于缓冲区的长度。
		 {
			for(i=0;i<len1;i++)
			{
				MyReadBytes(address1,CopyBuff,COPYLEN);   
				ComWriteBytes(address2,CopyBuff,COPYLEN);               
	            address1  += COPYLEN;
	            address2  += COPYLEN;
			}	
			MyReadBytes(address1,CopyBuff,len2);   
			ComWriteBytes(address2,CopyBuff,len2);
		 }	
		 else                     //length小于缓冲区的长度。
		 {	
			MyReadBytes(address1,CopyBuff,length);   
			ComWriteBytes(address2,CopyBuff,length);	
	 	 }
  	}	   	  
}

/***********************************************************************************************************
功能:CopyToMyRam,从公共RAM里拷贝相应的数据到自己的RAM。
描述:实现从公共RAM里通过数组CopyBuff[COPYLEN]拷贝数据到自己的RAM,如果长度不超过缓冲区长度就一次拷贝过去,假
     如长度超过缓冲区长度就分几次拷贝过去。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度 
返回:无
************************************************************************************************************/
void CopyToMyRam(uint address1,uint address2,uint length)
{
   xdata uchar CopyBuff[COPYLEN];   //缓冲区数组。
   uchar i,len1,len2;
   len1=(uchar)(length / COPYLEN);  //拷贝的次数。
   len2=(uchar)(length % COPYLEN);  //拷贝的余数。

	if(length>0)                    //验证length的有效性。
	{
		 if(length>COPYLEN)         //length大于缓冲区的长度
		 {
			for(i=0;i<len1;i++)
			{
			   ComReadBytes(address1,CopyBuff,COPYLEN);   
			   MyWriteBytes(address2,CopyBuff,COPYLEN);                   
	           address1  += COPYLEN ;
	           address2  += COPYLEN ;
			}
			ComReadBytes(address1,CopyBuff,len2);   
		    MyWriteBytes(address2,CopyBuff,len2);
		 }	
		 else                      //length小于缓冲区的长度。
		 {
			ComReadBytes(address1,CopyBuff,length);   
			MyWriteBytes(address2,CopyBuff,length);
 	     }
  	  }	    
}

/***********************************************************************************************************
功能:CopyAllToComRam(),把所有需要拷贝到公共RAM的从机数据拷贝的公共RAM中去。
描述:实现把所有需要拷贝到公共RAM的从机数据拷贝的公共RAM中去。
参数:无
返回:无
************************************************************************************************************/
void CopyAllToComRam()
{
    uint length = 0;
	uchar len = 0;
/********************************************从机外设数据******************************************/
    if(SlaveCode == SlaveCode1)
	{
	    /********************************************从机外设数据******************************************/
	    length=GetMyDataBytes(MyDataLenAdd);                    //再取出从机1数据的长度。
        if((length > 0) && (length <= MaxSlaveDataLen))
        {
          ClearComRam(ComSlaveLenAdd1);                          //先清除公共RAM数据区从机1数据的长度。
	      CopyToComRam(MyDataLenAdd,ComSlaveLenAdd1,2);         //再把长度写入公共RAM区从机1的长度地址中。
	      CopyToComRam(MyDataStart,ComSlaveDataStart1,length);  //再把从机的数据拷贝到公共RAM中去。
        }
        ClearMyRam(MyDataLenAdd);                                //写完后,原来的计数值清零,重新存储. 
		/********************************************从机外设数据******************************************/

		/********************************************从机报警数据******************************************/
        len = MyReadOneByte(WsAlarmLen);                 //取出从机1报警动作号长度. 
	    CopyToComRam(WsAlarm,ComAlarmStart1,len);        //拷贝从机的报警动作号到公共RAM中. 
	    ComWriteOneByte(ComAlarmLenAdd1,len);             //从机报警动作号长度写入公共RAM中.
	    MyWriteOneByte(WsAlarmLen,0x00);                 //清除从机1报警动作号长度. 
       /********************************************从机报警数据******************************************/
	}

	if(SlaveCode == SlaveCode2)
	{
	    /********************************************从机外设数据******************************************/
	    length=GetMyDataBytes(MyDataLenAdd);                    //再取出从机1数据的长度。
        if((length > 0) && (length <= MaxSlaveDataLen))
        {
          ClearComRam(ComSlaveLenAdd2);                          //先清除公共RAM数据区从机1数据的长度。
	      CopyToComRam(MyDataLenAdd,ComSlaveLenAdd2,2);         //再把长度写入公共RAM区从机1的长度地址中。
	      CopyToComRam(MyDataStart,ComSlaveDataStart2,length);  //再把从机的数据拷贝到公共RAM中去。
        }
        ClearMyRam(MyDataLenAdd);                                //写完后,原来的计数值清零,重新存储. 
		/********************************************从机外设数据******************************************/

		/********************************************从机报警数据******************************************/
        len = MyReadOneByte(WsAlarmLen);                 //取出从机1报警动作号长度. 
	    CopyToComRam(WsAlarm,ComAlarmStart2,len);        //拷贝从机的报警动作号到公共RAM中. 
	    ComWriteOneByte(ComAlarmLenAdd2,len);             //从机报警动作号长度写入公共RAM中.
	    MyWriteOneByte(WsAlarmLen,0x00);                 //清除从机1报警动作号长度. 
       /********************************************从机报警数据******************************************/
	}

	if(SlaveCode == SlaveCode3)
	{
	    /********************************************从机外设数据******************************************/
	    length=GetMyDataBytes(MyDataLenAdd);                    //再取出从机1数据的长度。
        if((length > 0) && (length <= MaxSlaveDataLen))
        {
          ClearComRam(ComSlaveLenAdd3);                          //先清除公共RAM数据区从机1数据的长度。
	      CopyToComRam(MyDataLenAdd,ComSlaveLenAdd3,2);         //再把长度写入公共RAM区从机1的长度地址中。
	      CopyToComRam(MyDataStart,ComSlaveDataStart3,length);  //再把从机的数据拷贝到公共RAM中去。

⌨️ 快捷键说明

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