Analisi protocollo seriale RS485 con scheda Arduino

#include <SoftwareSerial.h>
#define rxPin 10
#define txPin 11
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
void setup()  {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2,LOW);  
  mySerial.begin(9600);
  Serial.begin(9600);
}
void loop() {
  int n;
  char c;
  digitalWrite(2,HIGH);    
  mySerial.write(B01010101);
  digitalWrite(2,LOW);    
  delay(1);
}

Linea A

Linea B

 


Connessione multinodo

Software gestione slave

#include <SoftwareSerial.h>
/* struttura pacchetto:
 * destinatario
 * mittente
 * comando 
 * dato
*/
#define mitt   2 //mio indirizzo
#define wrdig1 1 //Out HIGH digitale
#define wrdig0 2 //Out LOW digitale
#define rddig  3 //In digitale
#define txctl  2 //Uscita controllo TX

#define rxPin 10
#define txPin 11

SoftwareSerial mySerial(rxPin, txPin); // RX, TX

unsigned long int t;
byte txbuf[4];  
byte rxbuf[4];
byte br=0;

bool rcvd=false;


void setup() 
{
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(txctl,OUTPUT);
  pinMode(txPin,OUTPUT);
  pinMode(rxPin,INPUT_PULLUP);
  digitalWrite(txctl,LOW);
}  

void hexprt(byte b)
{
  if (b<16)
    Serial.print("0");
  Serial.print(b,HEX);    
}

void prtrx()
{
  int n;
  Serial.print("Req: ");  
  for (n=0;n<4;n++)
  {
    hexprt(rxbuf[n]);    
    Serial.print(" ");
  }  
  if (rxbuf[0]==mitt)  
  {    
    Serial.println(" Mio!");    
  } 
  else   
    Serial.println();  
  
}
void prttx()
{
  int n;
  Serial.print("Resp:");  
  for (n=0;n<4;n++)
  {    
    hexprt(txbuf[n]);
    Serial.print(" ");
  }  
  Serial.println();  
}

void txpac(byte dest, byte comando, byte dato)
{    
  txbuf[0]=dest;
  txbuf[1]=mitt;
  txbuf[2]=comando;
  txbuf[3]=dato;
  digitalWrite(txctl,HIGH);  
  mySerial.write(txbuf,4);
  digitalWrite(txctl,LOW);  
  prttx();
 } 

void cmddecode()
{
  int n;
  prtrx();
  if (rxbuf[0]==mitt)  
  {        
    switch(rxbuf[2])
    {
      case 1:
        pinMode(rxbuf[3],OUTPUT);
        digitalWrite(rxbuf[3],HIGH);        
      break;
      case 2:
        pinMode(rxbuf[3],OUTPUT);
        digitalWrite(rxbuf[3],LOW);        
      break;
      case 3:
        pinMode(rxbuf[3],INPUT_PULLUP);
        rxbuf[3]=digitalRead(rxbuf[3]);        
      break;
      
    }
    txpac(rxbuf[1],rxbuf[2],rxbuf[3]);
  } 
  br=0;
  rcvd=false;
}
  

void loop() { 
  byte b;
  if (mySerial.available()) {
    b=mySerial.read();    
    if (!rcvd)
    {
      if ((millis()-t)>10)
      {        
        rxbuf[0]=b;
        br=1;                
        t=millis();        
      }
      else
      {                
        t=millis();
        rxbuf[br]=b;
        br++;
        if (br>=4)
        {
          rcvd=true;        
          cmddecode();
        }  
      }
    }
  }  
}

Software gestione master

#include <SoftwareSerial.h>
/* struttura pacchetto:
 * destinatario
 * mittente
 * comando 
 * dato
*/
#define mitt 1  //mio indirizzo
#define wrdig 1 //Out digitale
#define rddig 2 //In digitale
#define txctl 2 //Uscita controllo TX

#define rxPin 10
#define txPin 11

unsigned long int t;
byte rxbuf[4];
bool rcvd=false;
bool waitresp=false;
byte br=0;
int seq=0;

SoftwareSerial mySerial(rxPin, txPin); // RX, TX
  
void setup() 
{
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(txctl,OUTPUT);
  pinMode(txPin,OUTPUT);
  pinMode(rxPin,INPUT_PULLUP);
  digitalWrite(txctl,LOW);
}  


void hexprt(byte b)
{
  if (b<16)
    Serial.print("0");
  Serial.print(b,HEX);    
}


void txpac(byte dest, byte comando, byte dato)
{  
  int n;
  byte txbuf[4];  
  txbuf[0]=dest;
  txbuf[1]=mitt;
  txbuf[2]=comando;
  txbuf[3]=dato;
  digitalWrite(txctl,HIGH);  
  mySerial.write(txbuf,4);
  digitalWrite(txctl,LOW);  
  Serial.print("Req :");  
  for (n=0;n<4;n++)
  {    
    hexprt(txbuf[n]);
    Serial.print(" ");
  }  
  Serial.println(); 
} 
  
void cmddecode()
{
  int n;
  Serial.print("Resp:");  
  for (n=0;n<4;n++)
  {
    hexprt(rxbuf[n]);    
    Serial.print(" ");
  }  
  Serial.println();  
  waitresp=false;
}

void rxresp()
{
  byte b;
  if (mySerial.available())
  {
    b=mySerial.read();
    if (!rcvd)
    {
      rxbuf[br]=b;
      br++;
      if (br>=4)
      {
        rcvd=true;        
        cmddecode();
      }  
    }
  }
}


void loop() 
{ 
  if (waitresp)
  {
    rxresp();
    if ((millis()-t)>100)     
    {
      waitresp=false;
      Serial.println("Time out!!!");
    }  
  }
  else
  {
    delay(500);    
    if (seq>1)
      seq=0;
    switch (seq)
    {
      case 0: txpac(2, 1, 13) ;break;
      case 1: txpac(2, 2, 13) ;break;
      //case 2: txpac(3, 1, 13) ;break;
      //case 3: txpac(3, 2, 13) ;break;      
    }
    seq++;
    t=millis();
    br=0;
    rcvd=false;        
    waitresp=true;
  }  
}