Problema esecuzione codice per scrittura su SD

Ciao Ragazzi,
sto cercando di scrivere su una SD alcuni valori che mi arrivano dalla seriare. Il file su SD è già preimpostato quindi quando vado a scrivere so già cosa e dove andare a puntare.
Esempio

Uscite: 0_0_0_0_0_0;

se dalla seriale arriva di cambiare l’uscita 2 (£6U20^), il codice apre il file txt conta i caratteri e mi va a scrivere il nuovo valore (booleano) al punto giusto.

Sto usando un arduino uno rev 3 e il codice scritto funziona bene per le prime 26 stringhe che arrivano dalla seriale, dopodiché non fa più il suo lavoro.
Il processore non va in blocco, ho provato a stampare quello che arriva dalla seriare e correttamente mi viene stampato tutto anche dopo 100 stringhe inviata, ma quando devo andare a scrivere sulla SD dopo 26 stringhe mi viene solo aperto il file ma non esegue il resto. Ho provato anche a stampare fino a “if (myFile_2) {” e tutto funziona, dopo non viene più eseguito.

Posto il codice

#include <SPI.h>
#include <SD.h>
File myFile_2;

char c;
boolean startRead = false;
const byte cardSelect_pin = 4; //11 12 13 sono occupati da SD card.
char scheda[] = {'I', 'U', 'A', 'P'};
char pin [] = {'a', '1', 'A', '2', '3'};

boolean enableProcedura = false; // inizio memorizzazione caratteri da seriale
byte char_index = 0;      //contatore caratteri
char stringaArrivo[30];  //array per lettura da seriale

void setup() {
  pinMode(cardSelect_pin, OUTPUT); // sd card
  Serial.begin(9600);

  if (!SD.begin(cardSelect_pin)) {
    Serial.println("initialization failed!");
    return;
  }
}

void loop() {
//----   vuoto  --------
}

void serialEvent() {
  byte NcaratteriInArrivo = 0;  // numero di caratteri da memorizzare

  if (Serial.available() > 0) {
    char ch = Serial.read();
    if (ch == (char)'£' && char_index == 0) { // se il carattere è £ inizio a memorizzare la stringa che arriva
      enableProcedura = true;
    }
    else {
      char bitTrash = ch;   //altrimenti non prendo in considerazione i caratteri della seriale
    }
    if (enableProcedura == true) {
      NcaratteriInArrivo = (stringaArrivo[1] - 48); // memorizzao quanti caratteri sono in arrivo
      if ((ch != (char)NULL) && (ch != (char)' ') && (ch != (char)'\n') && (ch != (char)'\t') && (ch != (char)'\0')) {
        stringaArrivo[char_index] = ch;
        char_index++;
      }
    }
    if (char_index == NcaratteriInArrivo && enableProcedura == true) {  //se ho letto i caratteri che mi aspettavo analizzo l'array
      if (stringaArrivo[NcaratteriInArrivo - 1] != '^') {
        Serial.println("Errore da Seriale");
        enableProcedura = false;
        char_index = 0;
      }
      else {
        switch (stringaArrivo[2]) {
          case 'U':
            scriviSuFileDati(stringaArrivo[2], stringaArrivo[3], stringaArrivo[4]); // richiamo routin per scrivere su file
            break;
        }
        enableProcedura = false;
        char_index = 0;
      }
    }
  }
}
//-----------------£6U20^   uscita 1 = 0
//-----------------£6U21^   uscita 1 = 1




void scriviSuFileDati(char board, char pins, char azione) {
  boolean startRead = false;
  boolean enableWrite = false;
  byte cont = 0;
  int a = 0;
  int posizione = 0;
  char c;

  for (byte d = 0; pin[d] != pins; d++) { // viene contata la posizione del pin che corrisponde al file txt.
    cont = cont + 1;
  }
  
    myFile_2 = SD.open("FileDati.txt");
    if (myFile_2) {
      while (myFile_2.available()) {
        do {
          c = myFile_2.read();
          a = a + 1; //conto quanti caratteri vengono letti dal file txt
          if (c == board) { //se il carattere letto è uguale a comando dove voglio scrivere
            startRead = true;
          }
          if (startRead == true && c != ' ') { //dopo avere iniziato la procedura appena trovo lo spazio significa che poi c'è la seguenza per l'impostazione dei pin
            posizione = a; //viene memorizzata la posizione 
            enableWrite = true;
            startRead = false;
          }
          if (enableWrite == true) {
            myFile_2 = SD.open("FileDati.txt",  FILE_WRITE);
            myFile_2.seek(posizione + (cont * 2)); //vado a scivere il valore "azione" 
            myFile_2.print(azione);
            Serial.println("ok");
            enableWrite = false;
          }
        } while (c != -1);
      }
    }
    myFile_2.close(); // file chiuso
}

Mi sapete indicare perché avviene questo? C’è da resettare qualcosa o non utilizzo correttamente l’apertura e la chiusura del file txt?

Grazie

Apri il file 2 volte (cosa già discutibile) e lo chiudi una sola. C’è un probabile resource leak.

Quello che dovresti fare è: leggere il file, copiare quel che serve in un secondo file, cambiando quel che vuoi cambiare, e quindi eliminare il primo e rinominare il secondo.

Ciao, grazie della nota sull'apertura del file due volte e chiuderlo una volta. Al momento ho modificato il codice di scrittura su file

void scriviSuFileDati(char board, char pins, char azione) {
  boolean startRead = false;
  boolean enableWrite = false;
  byte cont = 0;
  int a = 0;
  int posizione = 0;
  char c;

  for (byte d = 0; pin[d] != pins; d++) { // viene contata la posizione del pin che corrisponde al file txt.
    cont = cont + 1;
  }

  myFile_2 = SD.open("FileDati.txt");
  if (myFile_2) {
    while (myFile_2.available()) {
      do {
        c = myFile_2.read();
        a = a + 1; //conto quanti caratteri vengono letti dal file txt
        if (c == board) { //se il carattere letto è uguale a comando dove voglio scrivere
          startRead = true;
        }
        if (startRead == true && c == ' ') { //dopo avere iniziato la procedura appena trovo lo spazio significa che poi c'è la seguenza per l'impostazione dei pin
          posizione = a; //viene memorizzata la posizione
          enableWrite = true;
          startRead = false;
        }
      } while (c != -1);
    }
  }
 myFile_2.close(); // file chiuso

  if (enableWrite == true) {
    myFile_2 = SD.open("FileDati.txt",  FILE_WRITE);
    myFile_2.seek(posizione + (cont * 2)); //vado a scrivere il valore "azione"
    myFile_2.print(azione);
    Serial.println("ok");
    enableWrite = false;
    myFile_2.close(); // file chiuso
  }
}

Ho provato a mandare 100 stringhe consecutive e non ho avuto errori o problemi. Quindi credo di aver risolto, o secondo te avrò ancora problemi di resource leak in futuro se arrivano 1000 stringhe senza resettare arduino?

Non ne ho idea, sicuramente va meglio di prima, altro non ti so dire. Se vuoi fare le cose per bene, la soluzione ideale è già delineata nel mio post precedente.