Protocollo RS485 (scambio byte)

Buonasera a tutti,
Non riesco a campire come scambiare i dati tra due arduino UNO collegati tramite due RS485

Master:

#include <SoftwareSerial.h>

#define SSerialRX        10
#define SSerialTX        11
#define SSerialTxControl 3
#define RS485Transmit    HIGH
#define RS485Receive     LOW
#define LED 13
SoftwareSerial rs485(SSerialRX, SSerialTX); // RX, TX

int byteSend;
byte curr[] = {0, 1, 2, 3};


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
  pinMode(LED, OUTPUT);
  rs485.begin(9600);

}


void loop() {

  //invio curr[0]
  // put your main code here, to run repeatedly:
  digitalWrite(SSerialTxControl, RS485Transmit);
  rs485.write(curr[0]);
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(SSerialTxControl, RS485Receive);

  delay(500);

  //invio curr[1]
  // put your main code here, to run repeatedly:
  digitalWrite(SSerialTxControl, RS485Transmit);
  rs485.write(curr[1]);
  digitalWrite(LED, LOW);
  delay(500);
  digitalWrite(SSerialTxControl, RS485Receive);

  delay(500);
  //invio curr[2]
  // put your main code here, to run repeatedly:
  digitalWrite(SSerialTxControl, RS485Transmit);
  rs485.write(curr[2]);
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(SSerialTxControl, RS485Receive);

  delay(500);
  //invio curr[3]
  // put your main code here, to run repeatedly:
  digitalWrite(SSerialTxControl, RS485Transmit);
  rs485.write(curr[3]);
  digitalWrite(LED, LOW);
  delay(500);
  digitalWrite(SSerialTxControl, RS485Receive);


}

mentre lo slave mi dovrebbe solo stampare il byte ricevuto

#include <SoftwareSerial.h>

#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin
#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW
#define Pin13LED         13

SoftwareSerial rs485(SSerialRX, SSerialTX); // RX, TX


byte byteReceived;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(Pin13LED, OUTPUT);
  pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver   
  rs485.begin(9600); 
}



void loop() {
  // put your main code here, to run repeatedly:

 if(rs485.available()){
  byteReceived = rs485.read();
  Serial.println(char(byteReceived));

  delay(10);
  //digitalWrite(13,byteReceived);
 }

}

Nel monitor dell'ide mi stampa solo il carattere ?....Grazie mille.

Stai inviando byte non rappresentabili nella codifica ascii, modifica solo questa dichiarazione:

byte curr[] = {48, 49, 50, 51};

Ciao.

Certo, stai stampando dei caratteri non stampabili...

P.S.
RS485 non è un protocollo, ma identifica un tipo di interfaccia di comunicazione seriale e descrive le caratteristiche elettriche dei segnali.

Oppure semplicemente modifica questo, stai spedendo numeri interi, non serve quel char()
Serial.println(byteReceived);

Ricorda che spedire un carattere '1' vuol dire spedire il valore 49 ovvero ascii di quel carattere (spedizione dati testuali) mentre spedire 1 come numero è diverso (spedizione dati a byte).

Come ti han detto sopra
byte curr[] = {48, 49, 50, 51};
che puoi anche scrivere
byte curr[] = {'0', '1', '2', '3'};

Il serial monitor standard di arduino mostra solo caratteri rappresentabili. Anche la barra send non accetta altro che caratteri. Chi ha necessità di lavorare con byte 0÷255 in vari formati (esa, oct ecc) deve per forza trovare un serial monitor alternativo, io ho installato SerialStudio (su Ubuntu), solo per windows mi pare ci sia TeraTerm.

SerialStudio Versione 2.0.0 funziona, ma non accetta il tasto enter del pad numerico.

Ciao.

... io suggerisco sempre CoolTerm (nella pagina del link scorrere leggermente verso il basso, è il primo prodotto), è gratuito, permette di fare di tutto ed è totalmente multi-piattaforma (Linux, macOS, Windows) :wink:

Guglielmo

Grazie mille a tutti :pray: :grinning:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.