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

📄 output.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 3 页
字号:
返回:无
************************************************************************************************************/
void WsSerialRecieve() interrupt 4 using 3    //注意:这个函数在程序里面没有用到,但是删除后有问题,暂时我们也不知道什么原因!
{ 
   if(RI) 
   {  
     uchar ch;
	 RI = 0; 
     ch = SBUF; 
     if(ch==0x3E)                   //若第一个字符为数据开始字符">"。
     { 
	   FlagStartRecv=1;             //开始接收标志置位。
	   RecvDataCount = -1;          //第一个字符不接收。
 	 }

     if(FlagStartRecv)              //若可以开始接收
	 {         
	   if(RecvDataCount >=0)        //若接收的个数大于0,验证接收个数的有效性。
	   {
	     RecvDataBuff[RecvDataCount]=ch;    //保存接收的数据
	   }
	   RecvDataCount++;                     //接收的个数加一
	   if(RecvDataCount > (RecvDataSize-1)) //如果接收的数据已经接收完毕
       {
		   FlagProcessRecvData=1;           //FlagProcessRecvData置位,通知函数来打包该数据。		   
           FlagStartRecv=0;                 //开始接收标识复位,暂时不接受外设数据。
           RecvDataCount=-1;                //接收个数也复位为-1.
	   }
	  }
    }
}

/***********************************************************************************************************
功能: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);
 	     }
  	  }	    
}

	               
/***********************************************************************************************************
功能:CopyAllToMyRam(),把公共RAM中所有相应的数据拷贝到再带RAM中去。
描述:实现把公共RAM中所有相应的数据拷贝到再带RAM中去,主要是拷贝服务器发来的存储在公共RAM中的命令。
参数:无
返回:无
************************************************************************************************************/
void CopyAllToMyRam()
{	
    uchar len = 0; 

    len = ComReadOneByte(ComAlarmLenAdd1);            //取出公共RAM中从机1报警动作号的长度。
	if((len > 0) && (len <= MaxSlaveAlarmLen))
	{
	    CopyToMyRam(ComAlarmStart1,Ws1Alarm,len);     //再把公共RAM中从机1报警动作号拷贝到输出机自带RAM中去。
		MyWriteOneByte(Ws1AlarmLen,len);              //再把公共RAM中从机1报警动作号长度拷贝到输出机自带RAM中去。
		ComWriteOneByte(ComAlarmLenAdd1,0x00);        //再把公共RAM中从机1报警动作号长度置0。
	}       

	len = ComReadOneByte(ComAlarmLenAdd2);            //取出公共RAM中从机2报警动作号的长度。
	if((len > 0) && (len <= MaxSlaveAlarmLen))
	{
	    CopyToMyRam(ComAlarmStart2,Ws2Alarm,len);     //再把公共RAM中从机2报警动作号拷贝到输出机自带RAM中去。
		MyWriteOneByte(Ws2AlarmLen,len);              //再把公共RAM中从机2报警动作号长度拷贝到输出机自带RAM中去。
		ComWriteOneByte(ComAlarmLenAdd2,0x00);        //再把公共RAM中从机2报警动作号长度置0。
	}       

	len = ComReadOneByte(ComAlarmLenAdd3);            //取出公共RAM中从机3报警动作号的长度。
	if((len > 0) && (len <= MaxSlaveAlarmLen))
	{
	    CopyToMyRam(ComAlarmStart3,Ws3Alarm,len);     //再把公共RAM中从机3报警动作号拷贝到输出机自带RAM中去。
		MyWriteOneByte(Ws3AlarmLen,len);              //再把公共RAM中从机3报警动作号长度拷贝到输出机自带RAM中去。
		ComWriteOneByte(ComAlarmLenAdd3,0x00);        //再把公共RAM中从机3报警动作号长度置0。
	}       

	len = ComReadOneByte(ComAlarmLenAdd4);            //取出公共RAM中从机4报警动作号的长度。
	if((len > 0) && (len <= MaxSlaveAlarmLen))
	{
	    CopyToMyRam(ComAlarmStart4,Ws4Alarm,len);     //再把公共RAM中从机4报警动作号拷贝到输出机自带RAM中去。
		MyWriteOneByte(Ws4AlarmLen,len);              //再把公共RAM中从机4报警动作号长度拷贝到输出机自带RAM中去。
		ComWriteOneByte(ComAlarmLenAdd4,0x00);        //再把公共RAM中从机4报警动作号长度置0。
	}       

	len = ComReadOneByte(ComAlarmLenAdd5);            //取出公共RAM中从机5报警动作号的长度。
	if((len > 0) && (len <= MaxSlaveAlarmLen))
	{
	    CopyToMyRam(ComAlarmStart5,Ws5Alarm,len);     //再把公共RAM中从机5报警动作号拷贝到输出机自带RAM中去。
		MyWriteOneByte(Ws5AlarmLen,len);              //再把公共RAM中从机5报警动作号长度拷贝到输出机自带RAM中去。
		ComWriteOneByte(ComAlarmLenAdd5,0x00);        //再把公共RAM中从机5报警动作号长度置0。
	}       
}

/***********************************************************************************************************
功能:OutputAction(),处理报警动作号。
描述:实现动作号的输出。
参数:act---报警动作号
返回:无
************************************************************************************************************/
void OutputAction(uchar act)
{	
     uchar action = act;
     switch(act)
	 {
	     case ACTION1:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION2:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION3:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION4:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION5:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION6:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION7:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION8:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION9:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION10:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION11:
		 {
		    SendCharCom(action);
		 }
		 break;

		 case ACTION12:
		 {
		    SendCharCom(action);
		 }
		 break;

		 default:
		    SendCharCom(0xFF);
		 break;
	 }
}

/***********************************************************************************************************
功能:ProcessAlarm(),处理报警动作号。
描述:通过单片机的输出口输出给继电器,实现对报警动作号的处理。
参数:无
返回:无
************************************************************************************************************/
void ProcessAlarm()
{	
    uchar len = 0;
	uchar result = 0;
	uchar i = 0;
	uint address = 0;

	len = MyReadOneByte(Ws1AlarmLen);       //取出从机1的报警动作号的个数。
    
	if(len > 0)
	{
	   address = Ws1Alarm;                //赋值从机1动作号的开始地址。
	   for(i=0;i<len;i++)
	   {
	      address = Ws1Alarm + i;               //更新取从机1动作号的地址。
	      result = MyReadOneByte(address);     //取出从机1的报警动作。
		  OutputAction(result);                //处理从机1的报警动作号。             
	   }
	   MyWriteOneByte(Ws1AlarmLen,0x00);       //取出从机1的报警动作号的个数。
	}

	len = MyReadOneByte(Ws2AlarmLen);       //取出从机2的报警动作号的个数。
	if(len > 0)
	{
	   address = Ws2Alarm;                //赋值从机2动作号的开始地址。
	   for(i=0;i<len;i++)
	   {
	      address = Ws2Alarm + i;             //更新取从机2动作号的地址。
	      result = MyReadOneByte(address);   //取出从机2的报警动作。
		  OutputAction(result);              //处理从机2的报警动作号。
	   }
	   MyWriteOneByte(Ws2AlarmLen,0x00);       //取出从机2的报警动作号的个数。
	}

	len = MyReadOneByte(Ws3AlarmLen);       //取出从机3的报警动作号的个数。
	if(len > 0)
	{
	   address = Ws3Alarm;                //赋值从机3动作号的开始地址。
	   for(i=0;i<len;i++)
	   {
	      address = Ws3Alarm + i;             //更新取从机2动作号的地址

⌨️ 快捷键说明

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