Master Slave I2C

Buonasera a tutti,

sto lavorando con due schede arduino: una scheda mega 2560 e una scheda uno wifi rev2.
Le due schede sono collegate in i2c in master-slave (master è la scheda mega, la scheda uno è lo slave).
Alla scheda mega è collegato un gps (Adafruit Ultimate GPS Breakout).
Devo inviare una stringa che compongo io (utc+millis della mega) allo slave per fare elaborazione dai dati...
Sia la trasmissione, sia la ricezione dei dati devono essere gestite con degli interrupt
il codice è il seguente:
MASTER

#include <Wire.h>
#include <TinyGPS.h>
#include <Adafruit_GPS.h>
#include <SPI.h>
#include <SD.h>

int  x = 0;
//variable for GPS
float lat, lon;
//TinyGPS gps;  // create gps object--> con libreria TinyGPS.h
#define GPSSerial Serial3
Adafruit_GPS GPS(&Serial3);
#define GPSECHO false
uint32_t timer = millis();
String stringa_gps= " ";

File file, file_gps;
float currentTime;
char *prova_stringa = "";

bool usingInterrupt = false;
void useInterrupt(boolean);

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

  GPS.begin(9600);
  //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_GGAONLY);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); //dovrei mettere questo qua al posto di 10HZ
  //GPS.sendCommand(PMTK_SET_BAUD_9600);
  GPS.sendCommand(PGCMD_ANTENNA);

  //PER ABILITARE L'INTERRUPT
  useInterrupt(true);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (prova_stringa != ""){
    int l = strlen(prova_stringa);
    Wire.beginTransmission(8);
    //Wire.write(l);
    Wire.write(prova_stringa);
    Wire.endTransmission();
  }
  //x++;
  //if (x > 5) x = 0;
  //delay(500);
}

SIGNAL(TIMER0_COMPA_vect) {
  //file_gps = SD.open("gps.csv", FILE_WRITE);
  //OCR2A = reload;
  //TCNT1 = 0; //First, set the timer back to 0 so it resets for next interrupt
  char c = GPS.read();
  //Serial.println(c);

  // if you want to debug, this is a good time to do it!
#ifdef UDR0
  if (GPSECHO)
    if (c) UDR0 = c;  
    // writing direct to UDR0 is much much faster than Serial.print 
    // but only one character can be written at a time. 
#endif

  //prova_stringa = "142003.000, 1200.00";
  //Serial.println(prova_stringa);

  // --------- QUA INVIO LA STRINGA  -------------------
  if (GPS.newNMEAreceived()) {

    //Serial.println("BB");
    char *stringa;
    stringa = GPS.lastNMEA();
    //Serial.println(stringa);
    if(stringa[1] == 'G' && stringa[5] == 'A' && stringa[28] == 'N'){
      
      // ------------- SALVO SUL CSV I DATI DEL GPS -------------------
      // file_gps = SD.open("gps.csv", FILE_WRITE);
      // file_gps.print(millis());
      // file_gps.print(";");
      // file_gps.print(GPS.lastNMEA());
      // file_gps.close();
      // ---------------------------------------------------------------
      
      currentTime = millis(); //tempo attuale
      char time_gps[11];
      char timestamp[32] = " ";
      char millis_conv[20] = " ";

      strncpy(time_gps, stringa + 7, 10); // Copia i caratteri dall'indice 7 al 16
      time_gps[10] = '\0'; // Aggiungi il terminatore nullo

      // CREO IL MESSAGGIO CHE INVIERO' ALL'ALTRA SCHEDA...
      dtostrf(currentTime, 7, 2, millis_conv);
      strcpy(timestamp, time_gps);      // Copia la prima stringa in timestamp
      strcat(timestamp, ",");          // Concatena la virgola e lo spazio
      strcat(timestamp, millis_conv);   // Concatena la seconda stringa

      //INVIO IL MSG AL MASTER, RICHIAMO LA FUNZIONE 'trasmetti()'....
      prova_stringa = timestamp;
      Serial.println(prova_stringa);
      //trasmetti();
    }
    // file_gps.print(GPS.lastNMEA());
    // if (!GPS.parse(GPS.lastNMEA()))
    //   return; 
  }
}

void useInterrupt(boolean v) {
  if (v) {
    // Timer0 is already used for millis() - we'll just interrupt somewhere
    // in the middle and call the "Compare A" function above
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}

SLAVE

#include <Wire.h>

int x = 0;
String dato_ricevuto = "";
char myMsg[10];
volatile bool flag = false;

void setup() {
  Serial.begin(115200);
  // Start the I2C Bus as Slave on address 9
  Wire.begin(8);  
  // Attach a function to trigger when something is received.
  Wire.onReceive(receiveEvent);
}
void  receiveEvent(int howMany) {

  // while(Wire.available()) {
  //   char c;
  //   c = Wire.read();
  //   dato_ricevuto += c;
  // }
  Serial.println(howMany);
  for(int i=0; i<howMany; i++)
  {
    myMsg[i] = Wire.read();
  }
  myMsg[howMany] = '\0'; //insert null character
  flag = true;
}

void loop() {
  //Serial.println(dato_ricevuto);
  if(flag == true){
    Serial.println(myMsg);
    flag = false;
  }
  //dato_ricevuto = "";
  delay(1000);
}

Il mio problema è che in fase di ricezione ho una perdita di dati, qualcuno sa dirmi il perchè?
Grazie mille in anticipo,
Alberto.

Ma questi programmi compilano?

Anche fosse sembra codice trovato chissà dove e attaccato assieme dove c'è spazio
Diciamo: "raccattaccato"

Già alla prima riga del loop del master hai confuso stringhe di C con String del Cpp
E poi peggiora

Prova a darci una ripulita e mettere dei commenti coerenti, sia col codice che con quello che vuoi fare

i codici compilano, grazie

sai aiutarmi/darmi un consiglio per il problema esposto?

@cippe: Perché stai aprendo più discussioni (QUI ed anche QUI) sullo stesso argomento? Il cross-posting NON è ammesso né tollerato su questo forum.

Per lo stesso argomento decidi di usare UNA sola discussione e tratta tutto in quella.

Discussione chiusa.

Guglielmo