serial arduino mega NON riceve

Buongiorno a tutti, sono di nuovo qui a disturbare… :roll_eyes:

Sto lavorando ad una piccola rete rs485, in cui ci sono due arduino UNO e un arduino MEGA.

Quando invio dati via serial da arduino MEGA ad arduino UNO è tutto OK…
Ma quando invio i dati da UNO a MEGA, il mega non riceve… non entra nemmeno nel void serialEvent.

Ho provato anche a collegare direttamente le porte seriali di MEGA e UNO (escludendo intanto il terzo).

Non funziona.

Il codice sul MEGA è questo:

Serial2begin(9600);
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

...
void serial2Event() {
  while (Serial2.available()) {
    inrs485=Serial2.read();
  }
  Serial.write(inrs485);
  lcd.print("RX485");
  lcd.print(inrs485);
  inrs485=0;
    
}

Non funziona.

Ho provato anche con le altre seriali, addirittura con quella collegata all’USB, ma io invio i dti dal PC, arduinoMEGA non li riceve (con il monitor seriale).

Il programma dell’arduino UNO che invia i dati è questo (funzionante perchè vedo i dati anche con il monitor seriale collegato a arduino UNO):

...
if(digitalRead(12)==1){
Serial.write(20);
}

Ma il MEGA non riceve nulla.

Mi potete aiutare perfavore?

Grazie, Marco

Il codice del core di Arduino che richiama il serial event è:

void serialEventRun(void)
{
#ifdef serialEvent_implemented
  if (Serial.available()) serialEvent();
#endif
#ifdef serialEvent1_implemented
  if (Serial1.available()) serialEvent1();
#endif
#ifdef serialEvent2_implemented
  if (Serial2.available()) serialEvent2();
#endif
#ifdef serialEvent3_implemented
  if (Serial3.available()) serialEvent3();
#endif
}

quindi hai sbagliato il nome della funzione richiamata. correggi in serialEvent2

Per la cronaca, la funzione serialEventRun viene richiamata ogni fine loop nel main.c del core.

#include <Arduino.h>
int main(void)
{
	init();
#if defined(USBCON)
	USBDevice.attach();
#endif
	setup();
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
	return 0;
}

PaoloP: Il codice del core di Arduino che richiama il serial event è:

void serialEventRun(void)
{
#ifdef serialEvent_implemented
  if (Serial.available()) serialEvent();
#endif
#ifdef serialEvent1_implemented
  if (Serial1.available()) serialEvent1();
#endif
#ifdef serialEvent2_implemented
  if (Serial2.available()) serialEvent2();
#endif
#ifdef serialEvent3_implemented
  if (Serial3.available()) serialEvent3();
#endif
}

quindi hai sbagliato il nome della funzione richiamata. correggi in serialEvent2

[...]

AHHHAHH... il fatto è che ero proprio convinto quando lo scrivevo... Ho anche pensato "sarà giusto? mah, me lo dirà il compilatore..."

Grazie PaoloP

buongiorno, ho fatto alcune prove e tutto funziona correttamente. C'è però una piccola imprecisione nella comunicazione, cioè l'arduino uno invia i dati corretti, ma il mega li riceve sommati a 208. cioè se arduino uno invia 41, il mega riceve 208... perchè? invece se ad arduino uno gli attacco il cavo usb, il computer visualizza i dati giusti.

ciao, Marco

Hai collegato i GND delle due schede tra di loro? Se non l'ho hai fatto è come misurare la vera altezza di due persone che però portano scarpe diverse.

PaoloP:
Hai collegato i GND delle due schede tra di loro?
Se non l’ho hai fatto è come misurare la vera altezza di due persone che però portano scarpe diverse.

Si si sono collegate … Hanno la stessa alimentazione.

Per adesso ho “risolto” sottraendo il 208 che stranamente viene sommato ai dati in arrivo: :smiley:

INdati = Serial1.read()-208;

e per adesso funziona, ma se possibile vorrei capire perché fa così.