| 
 | 
回復 2# 驚天動地  
 
MASTER: 
 
 
 
    //---------------------------------- 
//RS 485 
//By Igor Real 
//24-06-09 
//---------------------------------- 
 
 
byte            data[12]; 
unsigned long   previous_time; 
unsigned long   previous_time2; 
byte            times_repeat=5; 
byte            times_repeat2=5; 
 
byte            state=0; 
byte            state2=0; 
 
#define  pinCONTROL    02 
#define  myaddress     01 
   
 
void setup() { 
 
   pinMode(13,OUTPUT); 
   pinMode(pinCONTROL,OUTPUT); 
   digitalWrite(13,HIGH); 
   digitalWrite(12,LOW); 
   pinMode(8,INPUT); 
   pinMode(9,INPUT); 
   digitalWrite(pinCONTROL,LOW); 
   Serial.begin(9600); 
   Serial.println("Empezamos"); 
   state=0; 
   state2=0; 
} 
 
void loop() 
{ 
 
  if (digitalRead(8)==state){ 
    state=!state; 
    times_repeat=0;   
  } 
  if (digitalRead(9)==state2){ 
    state2=!state2; 
    times_repeat2=0;   
  } 
 
   
   
   
  if (times_repeat<4){ 
    Serial.flush();   
    //(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4) 
    if (digitalRead(8)==HIGH){   
      sendMSG(48,49,68,48,48,32,48,48,48,49); 
    }else { 
      sendMSG(48,49,68,48,48,32,48,48,48,48); 
    } 
    times_repeat=times_repeat+1; 
   
    previous_time=millis(); 
    while (((millis()-previous_time)<500) && (Serial.available()!=15)){ 
      ;; 
    } 
   
    if (Serial.available()>=15){ 
      if (receiveMSG()==1){ 
        Serial.println("Trama correcta"); 
        if (data[0]==48 && data[1]==49 && data[2]==6){ 
          //ACK   
          times_repeat=5; 
          Serial.println("ACK recibido"); 
        } 
      } 
     } 
   }   
   
   
 
  if (times_repeat2<4){ 
    Serial.flush();   
    //(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4) 
    if (digitalRead(9)==HIGH){   
      sendMSG(48,50,68,48,48,32,48,48,48,49); 
    }else { 
      sendMSG(48,50,68,48,48,32,48,48,48,48); 
    } 
    times_repeat2=times_repeat2+1; 
   
    previous_time2=millis(); 
    while (((millis()-previous_time2)<500) && (Serial.available()!=15)){ 
    ;; 
    } 
   
    if (Serial.available()>=15){ 
      if (receiveMSG()==1){ 
        //Serial.println("Trama correcta"); 
        if (data[0]==48 && data[1]==50 && data[2]==6){ 
          //ACK   
          times_repeat2=5; 
          //Serial.println("ACK recibido"); 
        } 
      } 
    } 
  } 
   
   
   
} 
 
 
//------------------------ 
//FUNCIONES 
//------------------------ 
 
byte receiveMSG(){ 
 
  byte  byte_receive; 
  byte  state=0; 
  byte  cont1=1; 
  byte  trace_OK=0; 
 
  unsigned int checksum; 
  unsigned int checksum_trace; 
   
   
   
  while (Serial.available() > 0){ 
     
     byte_receive=Serial.read(); 
     if (byte_receive==00){ 
       state=1; 
       checksum_trace=0; 
       checksum=0; 
       trace_OK=0; 
       cont1=1; 
     }else if (state==1 && cont1<=12){ 
       data[cont1-1]=byte_receive; 
       checksum=checksum+byte_receive; 
       cont1=cont1+1; 
     }else if (state==1 && cont1==13){ 
       checksum_trace=byte_receive<<8; 
       cont1=cont1+1; 
     }else if (state==1 && cont1==14){ 
       checksum_trace=checksum_trace+byte_receive; 
       cont1=cont1+1; 
       state=0; 
       if (checksum_trace==checksum){ 
           trace_OK=1; 
       }else{ 
         trace_OK=0; 
       } 
       break; 
     } 
  } 
  return trace_OK; 
 
} 
 
 
 
void sendMSG(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){ 
   
  unsigned int checksum_ACK; 
  checksum_ACK=address1+address2+5+data_type+code1+code2+Sign+data1+data2+data3+data4+3; 
   
  UCSR0A=UCSR0A |(1 << TXC0); 
   
  digitalWrite(pinCONTROL,HIGH); 
  delay(1); 
 
  Serial.print(0,BYTE); 
  Serial.print(address1,BYTE); 
  Serial.print(address2,BYTE); 
  Serial.print(5,BYTE); 
  Serial.print(data_type,BYTE); 
  Serial.print(code1,BYTE); 
  Serial.print(code2,BYTE); 
  Serial.print(Sign,BYTE); 
  Serial.print(data1,BYTE); 
  Serial.print(data2,BYTE); 
  Serial.print(data3,BYTE); 
  Serial.print(data4,BYTE);   
  Serial.print(3,BYTE); 
  Serial.print(((checksum_ACK>>8)&255),BYTE); 
  Serial.print(((checksum_ACK)& 255),BYTE); 
  while (!(UCSR0A & (1 << TXC0))); 
  digitalWrite(pinCONTROL,LOW); 
 
   
   
} 
 
 
 
void sendACK(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){ 
   
  unsigned int checksum_ACK; 
  checksum_ACK=address1+address2+6+data_type+code1+code2+Sign+data1+data2+data3+data4+3; 
   
  UCSR0A=UCSR0A |(1 << TXC0); 
   
  digitalWrite(pinCONTROL,HIGH); 
  delay(1); 
 
  Serial.print(0,BYTE); 
  Serial.print(address1,BYTE); 
  Serial.print(address2,BYTE); 
  Serial.print(6,BYTE); 
  Serial.print(data_type,BYTE); 
  Serial.print(code1,BYTE); 
  Serial.print(code2,BYTE); 
  Serial.print(Sign,BYTE); 
  Serial.print(data1,BYTE); 
  Serial.print(data2,BYTE); 
  Serial.print(data3,BYTE); 
  Serial.print(data4,BYTE);   
  Serial.print(3,BYTE); 
  Serial.print(((checksum_ACK>>8)&255),BYTE); 
  Serial.print(((checksum_ACK)&255),BYTE); 
  while (!(UCSR0A & (1 << TXC0))); 
  digitalWrite(pinCONTROL,LOW); 
   
   
} 
 
void sendNAK(byte address1,byte address2,byte data_type,byte code1,byte code2,byte Sign,byte data1,byte data2,byte data3,byte data4){ 
   
  unsigned int checksum_ACK; 
  checksum_ACK=address1+address2+6+data_type+code1+code2+Sign+data1+data2+data3+data4+3; 
   
  UCSR0A=UCSR0A |(1 << TXC0); 
   
  digitalWrite(pinCONTROL,HIGH); 
  delay(1); 
 
  Serial.print(0,BYTE); 
  Serial.print(address1,BYTE); 
  Serial.print(address2,BYTE); 
  Serial.print(15,BYTE); 
  Serial.print(data_type,BYTE); 
  Serial.print(code1,BYTE); 
  Serial.print(code2,BYTE); 
  Serial.print(Sign,BYTE); 
  Serial.print(data1,BYTE); 
  Serial.print(data2,BYTE); 
  Serial.print(data3,BYTE); 
  Serial.print(data4,BYTE);   
  Serial.print(3,BYTE); 
  Serial.print(((checksum_ACK>>8)&255),BYTE); 
  Serial.print(((checksum_ACK)&255),BYTE); 
  while (!(UCSR0A & (1 << TXC0))); 
  digitalWrite(pinCONTROL,LOW); 
   
   
} 
 
 
 
byte hex2num(byte x){ 
 
  byte result; 
   
  if (x>=48 && x<=57){ 
    result=x-48;   
  }else if (x>=65 && x<=70){ 
    switch(x){ 
      case 65: 
        result=10; 
        break; 
      case 66: 
        result=11; 
        break; 
      case 67: 
        result=12; 
        break; 
      case 68: 
        result=13; 
        break; 
      case 69: 
        result=14; 
        break; 
      case 70: 
        result=15; 
        break;     
    }   
  } 
  return result;   
} |   
 
 
 
 |