Go Down

Topic: serial arduino mega NON riceve (Read 715 times) previous topic - next topic

marcolindo94

Buongiorno a tutti, sono di nuovo qui a disturbare... :smiley-roll:

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:
Code: [Select]

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):

Code: [Select]
...
if(digitalRead(12)==1){
Serial.write(20);
}


Ma il MEGA non riceve nulla.

Mi potete aiutare perfavore?

Grazie, Marco

PaoloP

#1
Jan 23, 2013, 03:19 pm Last Edit: Jan 23, 2013, 03:24 pm by PaoloP Reason: 1
Il codice del core di Arduino che richiama il serial event è:
Code: [Select]
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.
Code: [Select]
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}

marcolindo94


Il codice del core di Arduino che richiama il serial event è:
Code: [Select]
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

marcolindo94

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

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.

marcolindo94


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:  :D

Code: [Select]
INdati = Serial1.read()-208; 

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

Go Up