home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


comunicazione seriale tra 2 arduino
     
Autore Messaggio opzioni
daniele1979





postato il:
07.11.2022, alle ore 19:34
comunicazione seriale tra 2 arduino 

buona sera a tutti volevo fare comunicare 2 arduini con la seriale tramite il suo modulo rs485.
in una direzione sono riuscito a farlo comunicare.
per avere anche la comunicazione ne senso inverso , oltre alla scruct da mettere non so come fare ho avuto qualche idea ma non funzionanti in quanto andavano a altreare il dato che prima veniva letto correttamente.
 #include <SoftwareSerial.h>
#define SSerialRX        10
#define SSerialTX        11
#define SSerialTxControl 3
#define RS485Transmit    HIGH
#define RS485Receive     LOW
 
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
 
struct mydata {
  int cmd[3] = {822, 4256, 22};
  int count[3] = {0, 55, 338};
  int temp[3] = {18, 11794, 745};
  char str[20] = "hello world!";
  float val[2]  = {18.8,17.9};
};
mydata dato ;
 
 
 
void setup() {
  RS485Serial.begin(9600);
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
}
void loop() {
 if (RS485Serial.available()) {
    byte n = RS485Serial.read();
    if (n == 0) {
      Serial.println("mi chiama ");
      digitalWrite(13, HIGH);
      readSensor();
    }
  }
}
void readSensor() {
  digitalWrite(SSerialTxControl, RS485Transmit);
  RS485Serial.write((const uint8_t *)&dato, sizeof(struct mydata));
  RS485Serial.write((byte)'\n');
  dato.count[1]++;
  dato.val[1]=dato.val[1]+0.01;
  digitalWrite(SSerialTxControl, RS485Receive);
  digitalWrite(13, LOW);
  Serial.print("dato.count[1]"); Serial.println(dato.count[1]);
}


 #include <SoftwareSerial.h>
 
 
 
#define SSerialRX        9
#define SSerialTX        8
#define SSerialTxControl 7
#define RS485Transmit    HIGH
#define RS485Receive     LOW
 
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
 
 
struct mydata {
  int cmd[3];
  int count[3];
  int temp[3];
  char str[20];
  float val[2] ;
};
mydata dato;
 
byte stato = 0;
unsigned long previousMillis  = 0;
const long interval           = 200;
 
byte buff[100];
int i = 0;
 
void setup() {
  lcd.begin();
  lcd.backlight();
  RS485Serial.begin(9600);
  Serial.begin(9600);
  pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Receive);
}
 
 
 
void loop() {
  if (millis() - previousMillis >= interval) {
    previousMillis += interval;
    digitalWrite(SSerialTxControl, RS485Transmit);
    RS485Serial.write(stato );  //produce una sequenza: 0, 1, 2
    digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit
    if (stato < 5) stato = stato + 1;
    else  stato = 0;
  }
 
 
    if (RS485Serial.available()) {
      lcd.clear();
      byte n = RS485Serial.read();
      if ((char)n == '\n') {
        memcpy(&dato, buff, i);
        Serial.print(stato);        Serial.println(" stato");
        Serial.print(dato.cmd[1]);  Serial.print(" - ");
        Serial.print(dato.count[1]); Serial.print(" - ");
        Serial.print(dato.val[1]);  Serial.print(" - ");
        Serial.print(dato.temp[1]); Serial.print("\n");
        Serial.print(dato.str);     Serial.print("\n");
        Serial.print("ricevuti: "); Serial.print(i);
        Serial.println("bytes END");
 
        lcd.setCursor(0, 0);        lcd.print(dato.cmd[1]);
        lcd.setCursor(6, 0);        lcd.print(dato.val[1], 2);
        lcd.setCursor(0, 1);        lcd.print(dato.count[1]);
        lcd.setCursor(0, 2);        lcd.print(dato.temp[1]);
        lcd.setCursor(6, 1);        lcd.print(dato.val[0]);
        lcd.setCursor(0, 3);        lcd.print(dato.str);
        lcd.setCursor(12, 0);       lcd.print("ricevuti");
        lcd.setCursor(12, 1);       lcd.print(i);
        lcd.setCursor(15, 1);       lcd.print("byte");
        i = 0;
      } else {
        buff[i] = n;
        i++;
      }
    }
  

grazie
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
11.11.2022, alle ore 12:30
Se vuoi fare una comunicazione seriale tra 2 moduli (PIC) devi prima decidere se è un Master-Slave o Bidirezionale.

Nel primo caso, uno interroga l'altro e si fa mandare i dati (si può fare in polling).

Nel secondo caso, quando entrambi possono interrogare l'altro, devi usare la gestione della seriale ad interrupt e creare un buffer.
Conoscendo il protocollo (Start e End della stringa), puoi verificare in polling quando una stringa è stata ricevuta e poi rispondere. Questo per entrambi i moduli.



Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
11.11.2022, alle ore 12:32
Dimenticavo, devi anche decidere se i dati vengono trasmessi i binario o ASCII, questo è rilevante nella gestione del protocollo.


Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
daniele1979





postato il:
11.11.2022, alle ore 16:45
grazie della risposta,allora ho trovaro qualcosa in rete e ho cercato di adattarlo al mio uso
funziona mezzo e mezzo , ogni tanto di impalla piu voltentieri quello con l lcd

il file supporto. h va su entrambi



tx


rx


diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
13.11.2022, alle ore 09:19
Ti stai solo complicando la vita, con scarsi risultati.
L'unico modo per avere una comunicazione sicura è fare la ricezione ad interrupt.
La trasmissione la puoi fare con un timer o usando una funzione 'pronta' del compilatore.



Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
daniele1979





postato il:
13.11.2022, alle ore 14:38
ciao ggrazie della tua risposta,mai sentito il funzionaento come dici te ,
anche perche ' non sono un pozzo di scienza
dimenticavo la comunicazione e bidirezionale
mi potresti dare qualche esempio?
ho cercato ma ho solo trovato argomenti per lo sleep collegato agli interrupt
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
22.11.2022, alle ore 16:45
Tutti i microcontrollori hanno varie periferiche, tra cui almeno una chiamata UART, USART, ecc. che serve per la comunicazione seriale.

Nel caso della ricezione, questa periferica è in grado di capire quando è arrivato un carattere e può mandare un 'segnale' (interrupt) al processore se questa funzione è abilitata.

Pertanto devi fare questo nel codice :
1) configurare la periferica di comunicazione (settare i relativi registri)
2) abilitare l'interrupt relativo alla ricezione di un carattere
3) scrivere una funzione di gestione degli interrupt che provveda a creare un buffer di caratteri ricevuti
4) nel codice principale (Main) devi gestire il buffer e stabilire quando una stringa completa è stata ricevuta (protocollo)





Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
22.11.2022, alle ore 16:55
daniele1979:
non sono un pozzo di scienza


Quì non si tratta di essere scienziati!
Basta solo metterci un po' d'impegno e studiare i fondamenti delle tecniche che si vuole applicare.

Purtroppo oggi, grazie anche all'ArduCoso, la gente pensa che sia tutto semplice e pronto, e che non serva studiare e capire quello che si fa!

Questa è una grande distorsione che porta un grave danno in generale alla società, si perde il know-how e la capacità di risolvere i problemi.

Se non si trova una soluzione entro le 'librerie pronte' la gente è spaesata e senza gli strumenti per analizzare e risolvere i problemi.
Tanto meno è disposta a dedicare del tempo per imparare.



Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
diegobincoletto




una ogni 10 livelli una ogni 10 livelli


postato il:
23.11.2022, alle ore 09:57
Vedi questo :
https://docs.arduino.cc/built-in-examples/communication/Seri…



Scusate, passavo di qua\'...
L'unica rivoluzione possibile
è quella di migliorare se stessi.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale