Buongiorno ragazzi!
Allora, ho fatto qualche prova. Presi due mega, alimentato uno via USB e l'altro prendendo alimentazione dal primo per evitare eventuali problemi di riferimenti a massa, sul mega1 collegato in i2c un display 2x16 e un pulsante, poi:
TX Seriale1 Mega1 su RX Seriale1 Mega2
TX Seriale2 Mega2 su RX Seriale3 Mega1
Non ho usato la stessa seriale per TX ed RX poiché mi dava problemi, ma non ho capito perché. Sospetto sia qualche problema legato al buffer di trasmissione ma non me la sono sentita(per il momento) di cimentarmi nella lettura del datasheet del micro.
lo sketch del Mega1 è il seguente:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
void inviaPacchetto(byte datoinv, byte comandoinv, int ritardo)
{
Serial1.write(datoinv);
if ( ritardo > 0 )
delay(ritardo);
Serial1.write(comandoinv);
if ( ritardo > 0 )
delay(ritardo);
Serial1.write(datoinv+comandoinv);
if ( ritardo > 0 )
delay(ritardo);
lcd.setCursor(5,0);
lcd.print( datoinv);
lcd.setCursor(8,0);
lcd.print( comandoinv);
lcd.setCursor(11,0);
lcd.print( datoinv+comandoinv);
}
byte dato;
byte istruzione;
byte somma;
byte datoscrittura;
int ingresso = 7;
void setup()
{
Serial1.begin(57600);
Serial3.begin(57600);
lcd.init();
lcd.backlight();
pinMode(ingresso, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(ingresso) == LOW ) {
datoscrittura ++ ;
inviaPacchetto(datoscrittura, 3, 2);
delay(200);
}
if (datoscrittura >=20) {
datoscrittura=0;
lcd.clear()
}
if (Serial3.available() > 0){
dato=Serial3.read();
istruzione=Serial3.read();
somma=Serial3.read();
}
lcd.setCursor(0,0);
lcd.print( "inv");
lcd.setCursor(0,1);
lcd.print( "ric");
lcd.setCursor(5,1);
lcd.print( dato);
lcd.setCursor(8,1);
lcd.print( istruzione);
lcd.setCursor(11,1);
lcd.print( somma);
}
e come vedete praticamente ad ogni pressione del tasto sulla input7 aumenta datoscrittura fino a 20 e spedisce il pacchetto di 3 byte, rimanendo in attesa di risposta, risposta che viene inviata dal Mega2, con il seguente sketch:
byte dato;
byte istruzione;
byte somma;
void setup()
{
Serial1.begin(57600);
Serial2.begin(57600);
}
void loop()
{
if (Serial1.available() > 0){
dato=Serial1.read();
istruzione=Serial1.read();
somma=Serial1.read();
Serial2.write(dato);
Serial2.write(istruzione);
Serial2.write(somma);
}
}
il problema è che la lettura a display dei byte ricevuti non è corretta. Il primo byte lo legge correttamente ma non fa il reset a 20, gli altri due al primo invio si sentano a 255 e li rimangono
Ho provato a dare il comando di flush della seriale e clear del display ad ogni invio ma non cambia nulla.
Ho provato con la seriale USB a debuggare e praticamente i 3 byte partono corretti ma già il mega 2 li riceve confusi, il che mi fa pensare che sia un problema che nasce già al primo invio del pacchetto.
Vedete qualche errore grossolano negli sketch?
Attendo Vostre!
grazie, ciao!
Francesco