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

📄 protocol.h

📁 電源供應器analog電壓電流回受控制備PID功能並將運算結果透過SPI介面回傳另一顆單片機
💻 H
字号:
void PLCResponse(void)
{   
  unsigned char i,ChkSum,HiByte,LoByte,WordLen,k,j,TempByte;
  unsigned int Temp,WordAdrFrom;
  TxdIndex=0;ChkSum=0;WordAdrFrom=0;
  for (i=0;i<ReceivedByte-2;i++) ChkSum+=RxdBuf[i];      
  if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
  else HiByte=(ChkSum>>4)+0x30;
  if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
  else LoByte=(ChkSum&0x0f)+0x30; 
  if ( (HiByte==RxdBuf[ReceivedByte-2]) && (LoByte==RxdBuf[ReceivedByte-1]) ) {
    if (RxdBuf[3]=='4') {
      switch (RxdBuf[4]) {  
        case '2': //Bit Set COMMAND  
          switch (RxdBuf[6]) {
            case 'M':  
              PORTB|=0x02; 
              Temp=(RxdBuf[7]&0x0f)*1000; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[8]&0x0f)*100; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[9]&0x0f)*10; 
              WordAdrFrom+=Temp; 
              Temp=RxdBuf[10]&0x0f; 
              WordAdrFrom+=Temp;
              
              for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];  
              TxdBuf[5]='0'; 
              if ( RxdBuf[5]=='3') SnrBuf[WordAdrFrom]=0xff;
              if ( RxdBuf[5]=='4') SnrBuf[WordAdrFrom]=0;
               
              //k=9+(WordLen<<2)+1;        
              ChkSum=0; 
              for (i=0;i<6;i++) ChkSum+=TxdBuf[i];
              if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
              else HiByte=(ChkSum>>4)+0x30;
              if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
              else LoByte=(ChkSum&0x0f)+0x30; 
              TxdBuf[6]=HiByte;
              TxdBuf[7]=LoByte;
              TxdBuf[8]=ETX;    
              PORTB&=0xfd;
              PORTB|=0x04;
              
              USR|=0x40;  
              TxdByte=9;
              for (i=0;i<9;i++) {   
                TempByte=0; 
                for (j=0;j<7;j++) {
                  if ((TxdBuf[i]>>j)&0x01) TempByte++;
                }
                if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;   
                //UDR=TxdBuf[i]; 
                //while (1) {
                //  if (USR&0x40) break;
                //}    
                //USR|=0x40; 
              }  
              UDR=TxdBuf[0];    
               
              ReceivedEnd=0; 
              PORTB&=0xfb;
              break;
            default:
              break;
          }
          break; 
        case '4': //M Read Command
          if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
          else HiByte=RxdBuf[5]&0x0f;
          if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
          else LoByte=RxdBuf[6]&0x0f;
          WordLen=(HiByte<<4)+LoByte; 
          switch (RxdBuf[7]) {
            case 'M':
              Temp=(RxdBuf[8]&0x0f)*1000; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[9]&0x0f)*100; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[10]&0x0f)*10; 
              WordAdrFrom+=Temp; 
              Temp=(RxdBuf[11]&0x0f); 
              WordAdrFrom+=Temp;
              for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];  
              TxdBuf[5]='0'; 
              for (i=0;i<WordLen;i++) {
                if ( SnrBuf[WordAdrFrom+i]==0xff ) TxdBuf[6+i]='1';
                else TxdBuf[6+i]='0';   
                k=6+i+1;  
              } 
              ChkSum=0; 
              for (i=0;i<k;i++) ChkSum+=TxdBuf[i];
              if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
              else HiByte=(ChkSum>>4)+0x30;
              if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
              else LoByte=(ChkSum&0x0f)+0x30; 
              TxdBuf[k]=HiByte;
              TxdBuf[k+1]=LoByte;
              TxdBuf[k+2]=ETX;   
               
              USR|=0x40;   
              TxdByte=k+3; 
              for (i=0;i<k+3;i++) {   
                TempByte=0; 
                for (j=0;j<7;j++) {
                  if ((TxdBuf[i]>>j)&0x01) TempByte++;
                }
                if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;   
                //UDR=TxdBuf[i]; 
                //while (1) {
                //  if (USR&0x40) break;
                //}    
                //USR|=0x40; 
              }  
              UDR=TxdBuf[0];   
              ReceivedEnd=0; 
              break; 
            default:
              break;
                        
          }
          break;
        case '5': //M WRITE COMMAND  
          if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
          else HiByte=RxdBuf[5]&0x0f;
          if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
          else LoByte=RxdBuf[6]&0x0f;
          WordLen=(HiByte<<4)+LoByte;
          switch (RxdBuf[7]) {
            case 'M':  
              PORTB|=0x02; 
              Temp=(RxdBuf[8]&0x0f)*1000; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[9]&0x0f)*100; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[10]&0x0f)*10; 
              WordAdrFrom+=Temp; 
              Temp=RxdBuf[11]&0x0f; 
              WordAdrFrom+=Temp;
              
              for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];  
              TxdBuf[5]='0'; 
              for (i=0;i<WordLen;i++) {
                if ( RxdBuf[12+i]=='1') SnrBuf[WordAdrFrom+i]=0xff;
                else SnrBuf[WordAdrFrom+i]=0;
              } 
              //k=9+(WordLen<<2)+1;        
              ChkSum=0; 
              for (i=0;i<6;i++) ChkSum+=TxdBuf[i];
              if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
              else HiByte=(ChkSum>>4)+0x30;
              if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
              else LoByte=(ChkSum&0x0f)+0x30; 
              TxdBuf[6]=HiByte;
              TxdBuf[7]=LoByte;
              TxdBuf[8]=ETX;    
              PORTB&=0xfd;
              PORTB|=0x04;
              //UDR=0x44; 
               
              //UDR=TxdBuf[0];  
              USR|=0x40;  
              TxdByte=9;   
              for (i=0;i<9;i++) {   
                TempByte=0; 
                for (j=0;j<7;j++) {
                  if ((TxdBuf[i]>>j)&0x01) TempByte++;
                }
                if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;   
                //UDR=TxdBuf[i]; 
                //while (1) {
                //  if (USR&0x40) break;
                //}    
                //USR|=0x40; 
              }  
              UDR=TxdBuf[0];   
              ReceivedEnd=0; 
              PORTB&=0xfb;
              break;
            default:
              break;
          }
          break;
        case '6': //DR READ COMMAND
          if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
          else HiByte=RxdBuf[5]&0x0f;
          if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
          else LoByte=RxdBuf[6]&0x0f;
          WordLen=(HiByte<<4)+LoByte;
          switch (RxdBuf[7]) {
            case 'R':  
              PORTB|=0x02; 
              Temp=(RxdBuf[8]&0x0f)*10000; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[9]&0x0f)*1000; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[10]&0x0f)*100; 
              WordAdrFrom+=Temp; 
              Temp=(RxdBuf[11]&0x0f)*10; 
              WordAdrFrom+=Temp;
              Temp=RxdBuf[12]&0x0f; 
              WordAdrFrom+=Temp;  
              for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];  
              TxdBuf[5]='0'; 
              for (i=0;i<WordLen;i++) {
                if ( (DM[WordAdrFrom+i]&0xf000)>0x9000 ) TxdBuf[6+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0xf000)>>12)+0x37;
                else TxdBuf[6+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0xf000)>>12)+0x30;  
                if ( (DM[WordAdrFrom+i]&0x0f00)>0x0900 ) TxdBuf[7+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x0f00)>>8)+0x37;
                else TxdBuf[7+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x0f00)>>8)+0x30;      
                if ( (DM[WordAdrFrom+i]&0x00f0)>0x0090 ) TxdBuf[8+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x00f0)>>4)+0x37;
                else TxdBuf[8+(i<<2)]=(unsigned char)((DM[WordAdrFrom+i]&0x00f0)>>4)+0x30;    
                if ( (DM[WordAdrFrom+i]&0x000f)>0x0009 ) TxdBuf[9+(i<<2)]=(unsigned char)(DM[WordAdrFrom+i]&0x000f)+0x37;
                else TxdBuf[9+(i<<2)]=(unsigned char)(DM[WordAdrFrom+i]&0x000f)+0x30; 
                k=9+(i<<2)+1;  
              } 
                    
              ChkSum=0; 
              for (i=0;i<k;i++) ChkSum+=TxdBuf[i];
              if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
              else HiByte=(ChkSum>>4)+0x30;
              if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
              else LoByte=(ChkSum&0x0f)+0x30; 
              TxdBuf[k]=HiByte;
              TxdBuf[k+1]=LoByte;
              TxdBuf[k+2]=ETX;    
              PORTB&=0xfd;
              PORTB|=0x04;
              //UDR=0x44; 
               
              //UDR=TxdBuf[0];  
              USR|=0x40;  
              TxdByte=k+3; 
              for (i=0;i<k+3;i++) {   
                TempByte=0; 
                for (j=0;j<7;j++) {
                  if ((TxdBuf[i]>>j)&0x01) TempByte++;
                }
                if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;   
                //UDR=TxdBuf[i]; 
                //while (1) {
                //  if (USR&0x40) break;
                //}    
                //USR|=0x40; 
              }  
              UDR=TxdBuf[0];   
              ReceivedEnd=0; 
              PORTB&=0xfb;
              break;   
            default:
              break;
          }                                     
          break;
        case '7': //DR WRITE COMMAND  
          if ( RxdBuf[5]>'9' ) HiByte=(RxdBuf[5]-7)&0x0f;
          else HiByte=RxdBuf[5]&0x0f;
          if ( RxdBuf[6]>'9' ) LoByte=(RxdBuf[6]-7)&0x0f;
          else LoByte=RxdBuf[6]&0x0f;
          WordLen=(HiByte<<4)+LoByte;
          switch (RxdBuf[7]) {
            case 'R':  
              PORTB|=0x02; 
              Temp=(RxdBuf[8]&0x0f)*10000; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[9]&0x0f)*1000; 
              WordAdrFrom+=Temp;
              Temp=(RxdBuf[10]&0x0f)*100; 
              WordAdrFrom+=Temp; 
              Temp=(RxdBuf[11]&0x0f)*10; 
              WordAdrFrom+=Temp;
              Temp=RxdBuf[12]&0x0f; 
              WordAdrFrom+=Temp;  
              for (i=0;i<5;i++) TxdBuf[i]=RxdBuf[i];  
              TxdBuf[5]='0'; 
              for (i=0;i<WordLen;i++) {
                if ( RxdBuf[13+(i<<2)]>'9') DM[WordAdrFrom+i]=(RxdBuf[13+(i<<2)]-7)&0x0f;
                else DM[WordAdrFrom+i]=RxdBuf[13+(i<<2)]&0x0f;
                DM[WordAdrFrom+i]<<=4;
                if ( RxdBuf[14+(i<<2)]>'9') DM[WordAdrFrom+i]+=((RxdBuf[14+(i<<2)]-7)&0x0f);
                else DM[WordAdrFrom+i]+=(RxdBuf[14+(i<<2)]&0x0f);
                DM[WordAdrFrom+i]<<=4;
                if ( RxdBuf[15+(i<<2)]>'9') DM[WordAdrFrom+i]+=((RxdBuf[15+(i<<2)]-7)&0x0f);
                else DM[WordAdrFrom+i]+=(RxdBuf[15+(i<<2)]&0x0f);
                DM[WordAdrFrom+i]<<=4;  
                if ( RxdBuf[16+(i<<2)]>'9') DM[WordAdrFrom+i]+=((RxdBuf[16+(i<<2)]-7)&0x0f);
                else DM[WordAdrFrom+i]+=(RxdBuf[16+(i<<2)]&0x0f);
              } 
              //k=9+(WordLen<<2)+1;        
              ChkSum=0; 
              for (i=0;i<6;i++) ChkSum+=TxdBuf[i];
              if ( (ChkSum>>4)>9 ) HiByte=(ChkSum>>4)+0x37;
              else HiByte=(ChkSum>>4)+0x30;
              if ( (ChkSum&0x0f)>9 ) LoByte=(ChkSum&0x0f)+0x37;
              else LoByte=(ChkSum&0x0f)+0x30; 
              TxdBuf[6]=HiByte;
              TxdBuf[7]=LoByte;
              TxdBuf[8]=ETX;    
              PORTB&=0xfd;
              PORTB|=0x04;
              //UDR=0x44; 
               
              //UDR=TxdBuf[0];  
              USR|=0x40;  
              TxdByte=9; 
              for (i=0;i<9;i++) {   
                TempByte=0; 
                for (j=0;j<7;j++) {
                  if ((TxdBuf[i]>>j)&0x01) TempByte++;
                }
                if ( (TempByte%2)==1 ) TxdBuf[i]|=0x80;   
                //UDR=TxdBuf[i]; 
                //while (1) {
                //  if (USR&0x40) break;
                //}    
                //USR|=0x40; 
              }  
              UDR=TxdBuf[0];   
              ReceivedEnd=0; 
              PORTB&=0xfb;
              break;   
            default:
              break;
          }    
          break;
        default:
          break;
      } 
    }               
  }
  else ReceivedEnd=0;
}

⌨️ 快捷键说明

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