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

📄 receivetest.c~

📁 关于rs485通信及iic通信的程序
💻 C~
📖 第 1 页 / 共 4 页
字号:
      if(Tx_Count<Send_Size)                                 // 还没有发送到待发送数据包的最后一个字节
      {
     
           if(Send_Status==0x00)                             // 发送状态0x00表示正常发送状态
           {
                if(*P_RS485_Send_Buff==Data_Head)            // 当待发送的数据为Data_Head时,
                {                                            // 将状态转为0x01转换数据状态;
                    Send_Status=0x01;                        // 并发送0x7D
                    UDR=0x7D;     
                }
                else if(*P_RS485_Send_Buff==Data_Change)     // 当待发送的数据为Data_Head时,
                {
                    Send_Status=0x02;                        // 将状态转为0x02转换数据状态;  
                    UDR=0x7D;                                // 并发送0x7D
                } 
                else 
                {
                    UDR=*P_RS485_Send_Buff;                  // 没有转移,将待发送数据输出到数据寄存器                 
                    P_RS485_Send_Buff++;                     // 发送数据指针加1
                    Tx_Count++;                              // 发送计数器计数1次    
                } 
           }
           
           else if(Send_Status==0x01)                        // 发送状态为0x01时,
           {
                UDR=0x5E;                                    // 将0x5E输出到数据寄存器
                Send_Status=0x00;                            // 发送状态转为正常发送状态0x00,待发送下一字节数据
                P_RS485_Send_Buff++;                         // 发送数据指针加1
                Tx_Count++;                                  // 发送计数器计数一次     
           }   
                                                               
           else if(Send_Status==0x02)                        // 发送状态为0x02时,  
           { 
                UDR=0x5D;                                    // 将0x5E输出到数据寄存器
                Send_Status=0x00;                            // 发送状态转为正常发送状态0x00,待发送下一字节数据
                P_RS485_Send_Buff++;                         // 发送数据指针加1
                Tx_Count++;                                  // 发送计数器计数一次     
           }    
      
   
      }

      else                                                   // 发送完待发送数据最后一个字节
      {
          UDR=0x7E;                                          // 发送0x7E作帧结束标志
          Tx_Send_End=1;                                     // 置位发送结束标志        
      }
    
  }  

  else                                                       // 发送完一帧数据
  {
      DRE = 0;                                               // 发送完数据包之后,将485转换到接收状态 
      Tx_Send_End=0;                                         // 清发送结束标志
      Tx_Count=0;                                            // 发送完之后,中断发送计数器Tx_Count清0 
      Start_Delay=1;                                         // 发送完一帧数据之后启动延时检测回复包程序
  }

}





//----------------------------------------------------------------------------------------------   
//
//对接收到在接收缓冲区的数据进行判断,为回复包还是为数据包,为回复包的作数据处理
INT8U RS485_Data_Judge(void)
{  

  
  if((RS485_Receive_Buff[FunctionCode] & 0x80)==0x80)   // 当功能代码第七位为1时,接收到的为回复包,进行回复包处理
  {   
   return 0;                                            // 为回复包时返回0值  
  }
  
  else 
  {
   return 1;                                            // 当功能代码第七位为0,即接收到的为数据包,返回1值
  }
}


//----------------------------------------------------------------------------------------------   
// 字节判断函数
// 接收到的为数据包,再作判断,数据包处理函数   接收到的字节数与功能代码中说明的字节一致返回1,不一致返回0
INT8U  RS485_Byte_Judge(void)
{ 
 INT8U Handle_Data; 
 Byte_Len=0;                                            
 Handle_Data=RS485_Receive_Buff[FunctionCode] & 0x30;
 switch(Handle_Data)
 {
  case 0x00:
     if(Receive_Count==8)
     {
       Byte_Len=8;
       return 1; 
     }
     break;
     
  case 0x10:
     if(Receive_Count==40)
     {
       Byte_Len=40;
       return 1;
     }
     break;
     
  case 0x20:
     if(Receive_Count==128)
     {
       Byte_Len=128;
       return 1;
     }
     break;
  
   default:
        return 0;
        break;
   
 }
}


//----------------------------------------------------------------------------------------------   
// 
// 简单累加和校验,包括数据包和校验,数据头和校验
INT8U RS485_CRC_Judge(void)
{
  INT8U count;
     Receive_CheckHead=0;
      for(count=0; count<Byte_Len;count++)
      { 
        if(count==7)
        {
         //
        }
        else
        {
          Receive_CheckHead += RS485_Receive_Buff[count];       // 更新累加数据头和校验信息
        }
      }
     
 
   if(Receive_CheckHead==RS485_Receive_Buff[7])
   //if((Receive_CheckData==RS485_Receive_Buff[6]) && (Receive_CheckHead==RS485_Receive_Buff[7]))
   {     
      return 1;                                     //校验正确返回1;   
   }
   else
   {
      return 0;                                        // 校验错误返回0;
   }
} 
            
// //----------------------------------------------------------------------------------------------   
// //
// // 判断是否为自己的地址或广播地址,自己的地址返回Address_Self,广播地址返回Address_Broad;都不是返回Address_Rong
// INT8U   RS485_Address_Judge(void)
// {
//   INT8U data;
//   data=RS485_Receive_Buff[0];
//   if(data==RS485_Address_Broad)
//   {
//     return Address_Broad;
//   }
//   
//   else if(data==RS485_Address_Self)
//   {
//     return Address_Self;
//   }     
//   else
//   {
//     return  Address_Rong;
//   }
// }
//  
// 



//----------------------------------------------------------------------------------------------   
//
//IIC发送数据处理函数
void IIC_Send_Handle()
{
  INT8U i=12;
  INT8U IIC_Send_Count;
  UpdateFlag=1;                                               // 表示有数据更新          
  if( (RS485_Receive_Save[Order_Attribute]==0x42)||(RS485_Receive_Save[Order_Attribute]==0x62)
      ||(RS485_Receive_Save[Order_Attribute]==0x46) )         // 判断命令属性是否符合要求 
  
  {
     IICSendBuff[0]= 0x01;                                    // 状态标志不为0时,为有数据状态(命令属性符合要求的状态)     
     IICCSendDataheck += IICSendBuff[0];
     
     for(IIC_Send_Count=1;IIC_Send_Count<7;IIC_Send_Count++)
     {
        if(IIC_Send_Count==5)  
        {
           i=i+1;
        }
     
        IICSendBuff[IIC_Send_Count]=RS485_Receive_Save[i];
        IICCSendDataheck += IICSendBuff[IIC_Send_Count];
        i++;
     }
          
      IICCSendDataheck=(~IICCSendDataheck)+0x01;
      IICSendBuff[IIC_Send_Count]=IICCSendDataheck;         // 校验和,单字节累加和补码
  
  
  } 
  
  else
  {
    IICSendBuff[0]=0;                                         // 状态标志为0时,为无数据状态(命令属性不符合要求的状态)                                
  }
                                     
}

//----------------------------------------------------------------------------------------------   
//
//IIC接收数据处理函数
void IIC_Receive_Handle()
{  
 { 
    INT8U i,m,t;
    INT8U Aim_ID=8;
    RS485_Send_Buff[0]= 0x41;                    // 待发数据的目的地址为射频地址0x41
    RS485_Send_Buff[1]= RS485_Address_Self;      // 待发送数据的源地址为本机地址
    RS485_Send_Buff[2]= 0x10;                    // 待发送数据的功能代码,为首发40个字节的数据包
    RS485_Send_Buff[12]= 0x82;                   // 待发数据的源设备ID首位,源设备ID为82,0,0,01。
    RS485_Send_Buff[15]= 0x01;                   // 待发数据的源设备ID末位,源设备ID为82,0,0,01。
    RS485_Send_Buff[16]= 0x42;                   // 命令属性,此定为B,即0x42
    RS485_Send_Buff[17]= IICReceiveBuff[5];      // 命令参数,为IIC接收数据的第5位,第6位
    RS485_Send_Buff[18]= IICReceiveBuff[6];      // 命令参数,为IIC接收数据的第5位,第6位
    RS485_Send_Buff[23]= 0x10;                   // 待发数据有效数据的位数,此为16位数据
   for(i=1;i<5;i++)                              // 待发送数据的目标设备ID,为IIC接收到数据的第1到第4位置  
   {
     RS485_Send_Buff[Aim_ID]= IICReceiveBuff[i];
     Aim_ID++;
   } 
   
   for(m=8;m<40;m++)
   {
     Send_CheckData += RS485_Send_Buff[m];   
   }
   RS485_Send_Buff[6]=Send_CheckData; 
   
   for(t=0;t<7;t++)
   {
    Send_CheckHead += RS485_Send_Buff[t];   
   }
   RS485_Send_Buff[7]=Send_CheckHead; 

 }
 RS485_Send_Flag=1;

}



//----------------------------------------------------------------------------------------------   
//
// 设置回复包程序
void RS485_Answer_Set(void)
{
  INT8U i,Send_Answer_Checksum=0;
  //将目的地址和源地址放及回复包功能代码位放入回复回复包缓冲区RS485_Answer_Send_Buff
  RS485_Answer_Send_Buff[0]= RS485_Receive_Buff[1];     // 目的地址放入发送回复包缓冲区
  RS485_Answer_Send_Buff[1]= RS485_Receive_Buff[0];     // 源地址放入发送回复包缓冲区
  RS485_Answer_Send_Buff[2]= 0x80;                      // 回复包功能代码
  
  for(i=0;i<7;i++)
  {
    Send_Answer_Checksum+=RS485_Answer_Send_Buff[i];
  }
  
  RS485_Answer_Send_Buff[7]=Send_Answer_Checksum;
                        
}



//----------------------------------------------------------------------------------------------   
//
//数据包处理函数
void RS485_Data_Handle(void)
{

  INT8U Byte_Flag;                              // 字节标志,字节数相符为1,否则为0
  INT8U CRC_Flag;                               // CRC标志,CRC校验正确为1,否则为0 
  INT8U Address_Flag;                           // 地址标志,有自己本身地址。广播地址,和其他地址
  INT8U Receive_Data_Type;  
  
  Byte_Flag=RS485_Byte_Judge();  
  CRC_Flag=RS485_CRC_Judge();  
  //Address_Flag= RS485_Address_Judge();
  Address_Flag= RS485_Receive_Buff[0];
  Receive_Data_Type=RS485_Data_Judge();          // 判断为回复包还是为数据包
  
  if(Byte_Flag==1)
  {
      if(CRC_Flag==1) 
      {
        
         if(Address_Flag==RS485_Address_Self)
         {         
            if(Receive_Data_Type==0)  
            {

⌨️ 快捷键说明

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