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

📄 rs485.c

📁 RS485的通讯源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

/*********************************************************************************************************
** 函数名称: Back_Goods
** 功能描述: 确定设定的礼品参数
** 输 入  : 无
** 输 出  : 无	
**********************************************************************************************************/
void Back_Goods( unsigned int data_address )  
{
    unsigned char i, timers = 3; //buff[Goods*2+3], 
    unsigned int address;

    REN = 0;
    CS485 = 0; 

    SBUF = 0xaa;           //发送应答信号
    while(TI==0);          //等待发送完毕
    TI=0;
   
    REN=1;			      //返回到接收状态
	CS485=1;
   	RI = 0;
	while( RI == 0  );
	RI = 0;

	if(SBUF == 0xaa)
	  {
		 address = data_address;	//数据的起始地址
         buff[0] = 0x00;
	     buff[1] = Goods*2 ;

	     watch_dogs();          //喂狗
	     for(i=0; i< Goods*2; i++)	  //读出数据
	       buff[i+2] = byte_read( address++ );

	     buff[ Goods*2 + 2 ] = 0x00;
         for(i=0; i<Goods*2; i++)
	        buff[ Goods*2+2 ] += buff[i+2];  //累加和
	     watch_dogs();          //喂狗

LOOP4:
         REN = 0; 
	     CS485 = 0;   //发送状态
	     for(i=0; i< Goods*2+3; i++)
	       {
              SBUF = buff[i];
		      while(TI==0);
		      TI=0;
			  watch_dogs();          //喂狗
	       }

         REN = 1;			  //返回到接收状态
	     CS485 = 1;

	     watch_dogs();          //喂狗
	     while(RI == 0);
	     RI = 0;
	     watch_dogs();          //喂狗

	     if( SBUF != 0xaa)
	       {
		      timers --;
		      if(timers )
		        goto LOOP4;
		      else
		        {
			  	    REN=1;			  //返回到接收状态
			        CS485=1;
			     }
	       }
	  }	   	  
}

/*********************************************************************************************************
** 函数名称: Back_machine
** 功能描述: 确定设定的机器参数
** 输 入  : 无
** 输 出  : 无	
**********************************************************************************************************/
void Back_machine( unsigned int data_address )
{
    unsigned char  i, timers = 3;//buff[24],
    unsigned int address ;

    REN = 0;
    CS485 = 0; 

    SBUF = 0xaa;           //发送应答信号
    while(TI==0);          //等待发送完毕
    TI=0;
   
    REN=1;			      //返回到接收状态
	CS485=1;
   	RI = 0;
	while( RI == 0  );
	RI = 0;

	if(SBUF == 0xaa)
	  {
		 address = data_address;	//数据的起始地址
         buff[0] = 0x00;
	     buff[1] = 21 ;

	     watch_dogs();          //喂狗

	     for(i=0; i< 21; i++)	  //读出数据
	       buff[i+2] = byte_read( address++ );

	     buff[ 23 ] = 0x00;
         for(i=0; i< 21; i++)
	        buff[ 23 ] += buff[i+2];  //累加和
	     watch_dogs();          //喂狗

LOOP5:
         REN = 0; 
	     CS485 = 0;   //发送状态
	     for(i=0; i<24; i++)
	       {
              SBUF = buff[i];
		      while(TI==0);
		      TI=0;
			  watch_dogs();          //喂狗
	       }

         REN = 1;			  //返回到接收状态
	     CS485 = 1;

	     watch_dogs();          //喂狗
	     while(RI == 0);
	     RI = 0;
	     watch_dogs();          //喂狗

	     if( SBUF != 0xaa)
	       {
		      timers --;
		      if(timers )
		        goto LOOP5;
		      else
		        {
			  	    REN=1;			  //返回到接收状态
			        CS485=1;
			     }
	       }
	  }	   
}

/*********************************************************************************************************
** 函数名称: Back_all_num
** 功能描述: 回收礼品机的所有参数
** 输 入  : 无
** 输 出  : 无	
**********************************************************************************************************/
void Back_all_num( unsigned int data_address ) 
{
    unsigned char  i, timers = 3; //buff[30],
	unsigned int address ;

    REN = 0;
    CS485 = 0; 

    SBUF = 0xaa;           //发送应答信号
    while(TI==0);          //等待发送完毕
    TI=0;
   
    REN=1;			      //返回到接收状态
	CS485=1;
   	RI = 0;
	while( RI == 0  );
	RI = 0;

	if( SBUF == 0xaa )   //接收准备好信号
	  {
	     address = data_address;	//数据的起始地址
         buff[0] = 0x00;
	     buff[1] = 27 ;

	     watch_dogs();          //喂狗

	     for(i=0; i< 27; i++)	  //读出数据
	       {
		       buff[i+2] = byte_read( address++ );
			   watch_dogs();
			}

		 buff[ 29 ] = 0x00;
         for(i=0; i< 27; i++)
	        buff[ 29 ] += buff[i+2];  //累加和
	     watch_dogs();                //喂狗

LOOP6:
         REN = 0; 
	     CS485 = 0;   //发送状态
	     for(i=0; i<30; i++)
	       {
              SBUF = buff[i];
		      while(TI==0);
		      TI=0;
			  watch_dogs();          //喂狗
	       }

         REN = 1;			  //返回到接收状态
	     CS485 = 1;

	     watch_dogs();          //喂狗
	     while(RI == 0);
	     RI = 0;
	     watch_dogs();          //喂狗

	     if( SBUF != 0xaa)
	       {
		      timers --;
		      if(timers )
		        goto LOOP6;
		      else
		        {
			  	    REN=1;			  //返回到接收状态
			        CS485=1;
			     }
	       } 		 
	  }
}

/*********************************************************************************************************
** 函数名称: Back_all_num
** 功能描述: 回收礼品机的礼品参数
** 输 入  : 无
** 输 出  : 无	
**********************************************************************************************************/
void Back_all_Goods( unsigned int data_address )
{
    unsigned char  i, timers = 3;//buff[ 51 ],
	unsigned int address ;

    REN = 0;
    CS485 = 0; 

    SBUF = 0xaa;           //发送应答信号
    while(TI==0);          //等待发送完毕
    TI=0;
   
    REN=1;			      //返回到接收状态
	CS485=1;
   	RI = 0;
	while( RI == 0  );
	RI = 0;

	if( SBUF == 0xaa )   //接收准备好信号
	  {
	     address = data_address;	//数据的起始地址
         buff[0] = 0x00;
	     buff[1] = 48 ;

	     watch_dogs();          //喂狗

	     for(i=0; i< 48; i++)	  //读出数据
	       {
		       buff[i+2] = byte_read( address++ );
			   watch_dogs();
			}

		 buff[ 50 ] = 0x00;
         for(i=0; i< 48; i++)
	        buff[ 50 ] += buff[i+2];  //累加和
	     watch_dogs();                //喂狗

LOOP7:
         REN = 0; 
	     CS485 = 0;   //发送状态
	     for(i=0; i<51; i++)
	       {
              SBUF = buff[i];
		      while(TI==0);
		      TI=0;
			  watch_dogs();          //喂狗
	       }

         REN = 1;			  //返回到接收状态
	     CS485 = 1;

	     watch_dogs();          //喂狗
	     while(RI == 0);
	     RI = 0;
	     watch_dogs();          //喂狗

	     if( SBUF != 0xaa)
	       {
		      timers --;
		      if(timers )
		        goto LOOP7;
		      else
		        {
			  	    REN=1;			  //返回到接收状态
			        CS485=1;
			     }
	       } 		 
	  }
}
/*********************************************************************************************************
** 函数名称: Set_all_num
** 功能描述: 设定礼品机的所有参数
** 输 入  : 无
** 输 出  : 无	
**********************************************************************************************************/
void Set_all_num( unsigned int data_address )
{
   unsigned char i,timers = 3;//buff[40],
   unsigned int Data_Long = 0;
   unsigned int address ;

   REN = 0;
   CS485 = 0; 

   SBUF = 0xaa;           //发送应答信号
   while(TI == 0);        //等待发送完毕
   TI = 0;

   watch_dogs();          //喂狗

LOOP7:
   CS485 = 1;             //接收状态
   REN = 1; 			     
   RI = 0;
   
   //----------------------得到要接收数据的个数
   watch_dogs();          //喂狗
   while(RI  == 0);
   buff[ 0 ] = SBUF ;
   RI = 0;

   watch_dogs();          //喂狗
   while(RI  == 0);
   buff[ 1 ] = SBUF ;
   RI = 0;

   watch_dogs();          //喂狗
   Data_Long = buff[0]*256 +buff[1];  

   for(i=0; i<=Data_Long; i++)
     {
	    while(RI==0);   
		buff[i+2] = SBUF;
		RI=0;
		watch_dogs();          //喂狗
	 }

   //------------------------数据验证
   buff[Data_Long+3] = 0x00;
   for(i=0; i< Data_Long; i++)
	  buff[Data_Long+3] += buff[i+2];

   watch_dogs();          //喂狗
   if(buff[Data_Long+3] == buff[ Data_Long+2 ])
     {														   
	    REN = 0;				//数据接收正确
		CS485 = 0; 
		SBUF = 0xaa;           //发送应答信号
		while(TI == 0);        //等待发送完毕
		TI = 0;
		
		//-------------------保存数据
		watch_dogs();          //喂狗
		address = data_address;
		for(i=0; i<Data_Long; i++)
          {  
			 byte_write(address,buff[i+2]);
			 address++;
		   }

		watch_dogs();          //喂狗
		byte_write(0x00,0xaa); //数据写入,写标志位
   	    REN = 1;	   //回到接收状态
		CS485 = 1;	 
	 }
   else
     {
	 	REN = 0;	            //发送数据重发信号
		CS485 = 0; 

		watch_dogs();          //喂狗
		SBUF = 0xFB;           //发送应答信号,数据重发
        while(TI == 0);        //等待发送完毕
		TI = 0;

		timers -- ;
		if( timers )
		  goto LOOP7;
		REN = 1;	   //回到接收状态
		CS485 = 1; 
	 }
}

/*********************************************************************************************************
** 函数名称: Read_all_num
** 功能描述: 确定设定的所有参数
** 输 入  : 无
** 输 出  : 无	
**********************************************************************************************************/
void Read_all_num( unsigned int data_address )
{
    unsigned char i, timers = 3; //buff[36], 
	unsigned int address ;

    REN = 0;
    CS485 = 0; 

    SBUF = 0xaa;           //发送应答信号
    while(TI==0);          //等待发送完毕
    TI=0;
   
    REN=1;			      //返回到接收状态
	CS485=1;
   	RI = 0;
	while( RI == 0  );
	RI = 0;

	if( SBUF == 0xaa )   //接收准备好信号
	  {
	     address = data_address;	//数据的起始地址
         buff[0] = 0x00;
	     buff[1] = 33 ;

	     watch_dogs();          //喂狗

	     for(i=0; i< 33; i++)	  //读出数据
	       {
		       buff[i+2] = byte_read( address++ );
			   watch_dogs();
			}

		 buff[ 35 ] = 0x00;
         for(i=0; i< 33; i++)
	        buff[ 35 ] += buff[i+2];  //累加和
	     watch_dogs();                //喂狗

LOOP8:
         REN = 0; 
	     CS485 = 0;   //发送状态
	     for(i=0; i<36; i++)
	       {
              SBUF = buff[i];
		      while(TI==0);
		      TI=0;
			  watch_dogs();          //喂狗
	       }

         REN = 1;			  //返回到接收状态
	     CS485 = 1;

	     watch_dogs();          //喂狗
	     while(RI == 0);
	     RI = 0;
	     watch_dogs();          //喂狗

	     if( SBUF != 0xaa)
	       {
		      timers --;
		      if( timers )
		        goto LOOP8;
		      else
		        {
			  	    REN=1;			  //返回到接收状态
			        CS485=1;
			     }
	       } 		 
	  }		 
}

⌨️ 快捷键说明

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