Go Down

Topic: arduino si riavvia da solo ... poca ram? (Read 3381 times) previous topic - next topic

leo72

Inoltre ti avevano già suggerito, mi pare, di usare la funzione F() per memorizzare le stringhe di testo dei commenti fatti con Serial.println() direttamente nella Flash per evitare che occupassero la RAM.
Esempio:
Code: [Select]
Serial.println("error opening test.txt");

diventa

Code: [Select]
Serial.println(F("error opening test.txt"));

lesto

Quote
1)  if (String("#") == (String(myFile.read()))){ dici qui giusyo? se non metto string, mi sembra che mi riporti i caratteri in formato esadecimale no? quindi al posto di string mi dici di mettere byte?

2) while (myFile.available()) { intendi qui? dovrei togliere il available?


per fare un confronto non ti interessa di farlo in esadecimale, ottale binario o altro. quindi diventa if ( '#' == myFile.read() )

poi non devi togliere l'available. Ogni volta che chiari read estrai una lettera dal flusso (che può essere file, seriale, internet o quello che vuoi). Quello che tu fai è una read() ogni volta che vuoi confrontare il carattere, ma così facendo in realtà stai leggendo ogni volta una lettera diversa. Devi fare una read in una variabile char una sola volta a ciclo e poi usare la variabile. In questo modo stai lavorando sempre con la stessa lettera
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Schwibby

a questo punto però per esempio nell else:

Code: [Select]
else {
    client.print(String(myFile.read()))


devo lascairlo come stringa perchè mi serve che mi stampi il carattere corretto giusto?


Quote
poi non devi togliere l'available. Ogni volta che chiari read estrai una lettera dal flusso (che può essere file, seriale, internet o quello che vuoi). Quello che tu fai è una read() ogni volta che vuoi confrontare il carattere, ma così facendo in realtà stai leggendo ogni volta una lettera diversa. Devi fare una read in una variabile char una sola volta a ciclo e poi usare la variabile. In questo modo stai lavorando sempre con la stessa lettera


se ho capito bene devo , prima mettere il varore del read in una nuova variabile, confrontare la mia variabile , rifare il ciclo in modo che andrò a sostituire la mia variabile col nuovo carattere letto , finche non troverò il /n ,
ho aggiunto in fondo alla stringa un # però , perchè ho pensato che leggendo byte a byte non leggerò mai un /n (non come carattere vero ma come andata a capo) perchè sono 2 byte giusto? quindi al primo passaggio del ciclo leggo / al secondo n... quindi devo per forza usare un delimitatore come il cancelletto... o sto toppando?

lesto

#18
Oct 17, 2012, 11:12 am Last Edit: Oct 17, 2012, 11:23 am by lesto Reason: 1
no, la print si occupa da sla della conversione, perchè è intelligente, in base a che tipo di variabile gli scrivi te la traduce automaticamente in stringa. Se invece della stringa volessi scrivere il valore "grezzo" dovresti usare una write

edit: lo \n è UN carattere che vuol dire a capo. Windows in effetti usa DUE caratteri, che sono \r seguito da uno \n, ma come vedi a te basta trovare lo \n

anche il # non ti serve, perchè quando finisce il file l'available ritorna 0
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Schwibby

quindi se al posto di if ( '#' == lamiavariabile ){           metto '/n' arduino capisce gia da solo che sto cercando un andata a capo?  :smiley-eek-blue: :smiley-eek-blue: :smiley-eek-blue:

mi sono letto il libro su arduino (il primo credo) e queste cose non le ho viste .... mi conviene prendere anche un libro sul C ?

vengo dal settore elettronico, non informatico,,, scusate   :smiley-red:

lesto

studiati questa guida sul C
http://arduino.cc/playground/Italiano/Newbie
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Schwibby

allora

con questo codice :

Code: [Select]
void Leggi_SD(){
char n;
  myFile = SD.open("KKKVigne.txt", FILE_READ);
  if (myFile) {
    Serial.println(F("Inizio a Leggere KKKVigne:"));
    if (client.connect(server, 80)){
      Serial.println(F("Connesso al Server"));  // debug
        while (myFile.available()) {
        n = myFile.read();
       
          if ( char('#') == n ){         
            client.println(Host);
            Serial.println(Host); // debug
            client.println();
            Serial.println(); // debug
            //Serial.println(n);
            //Serial.println(F("fine riga")); // debug
          }
          else {
        client.print(n);
            Serial.print(n); //debug

           
          }
        }
      myFile.close();
      Serial.println(F("Chiudo SD"));
      client.stop();
      Serial.println(F("Chiudo Socket TCP"));
     
      }
      else {
        // if the file didn't open, print an error:
        Serial.println(F("Errore invio"));
      }
} else {

    Serial.println(F("errore apertura KKKVigne.txt"));
  }
}//fine leggi sd


Ottengo sulla Seriale :

Code: [Select]
Inizio a Leggere KKKVigne:
Connesso al Server
Get /index.php?Data=20121017&Ora=124514&Ingresso=1&Uscita=0&Accesso=1 HTTP/1.1 Host: www.kioskomatiko.it


Get /index.php?Data=20121017&Ora=124918&Ingresso=1&Uscita=0&Accesso=1 HTTP/1.1 Host: www.kioskomatiko.it


Get /index.php?Data=20121017&Ora=125010&Ingresso=1&Uscita=1&Accesso=0 HTTP/1.1 Host: www.kioskomatiko.it


Get /index.php?Data=20121017&Ora=125016&Ingresso=2&Uscita=1&Accesso=1 HTTP/1.1 Host: www.kioskomatiko.it


Get /index.php?Data=20121017&Ora=125059&Ingresso=2&Uscita=2&Accesso=0 HTTP/1.1 Host: www.kioskomatiko.it


Get /index.php?Data=20121017&Ora=171032&Ingresso=1&Uscita=0&Accesso=1 HTTP/1.1 Host: www.kioskomatiko.it


Chiudo SD
Chiudo Socket TCP



sembrerebbe quasi ok .... dico quasi perchè sembra che non arrivi cio al server dato che non scrive nel database

Schwibby

ho mandato a capo l'Host e ora funziona scusate :)

Schwibby

Code: [Select]
void Leggi_SD(){
char n;
  myFile = SD.open("KKKVigne.txt", FILE_READ);
  if (myFile) {
    Serial.println(F("Inizio a Leggere KKKVigne:"));
    if (client.connect(server, 80)){
      Serial.println(F("Connesso al Server"));  // debug
        while (myFile.available()) {
        n = myFile.read();
       
          if ( char('#') == n ){   
            client.println();
            client.println(Host);
            client.println();
            delay(50);
           
            client.stop();
            delay(50);
            (client.connect(server, 80));
            Serial.println(F("nuovo dato inviato")); // debug
          }
          else {
        client.print(n);
                       
          }
        }
      myFile.close();
      Serial.println(F("Chiudo SD"));
      client.stop();
      Serial.println(F("Chiudo Socket TCP"));
     
      }
      else {
        // if the file didn't open, print an error:
        Serial.println(F("Errore invio"));
      }
} else {

    Serial.println(F("errore apertura KKKVigne.txt"));
  }
}//fine leggi sd


il mio problema ora è : se lascio cosi tutto bene ma apro e chiudo la connessione ad ogni riga... (mi sembra poco furbo, inoltre alcuni firewall potrebbero rilevarmi come attacco).

se  tolgo ad ogni riga un chiudi connessione e riaprila, arrivati a 30 righe arduino continua a mandare ma l'ethernet shield non fa uscire piu nulla.... c'è un motivo?

lesto

uhmm che la libreria usi dei buffer dinamici? usa un client.flush()
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Schwibby

gia provato... chiedo scusa se non ho specificato... a metterlo ad ogni ciclo prima dell invio di una nuova riga .... ottengo che da 30 righe ne mando fino a 100 ma poi si blocca lo stesso.....

lesto

uhmm allora inizio a credere che ci sia un bug nella libreria che crea garbage. Quando riapri una connessione probabilmente lo fai su un nuovo oggetto, e quindi tutto il garbage viene freeato, ma detta così non sta molto in piedi la cosa. devo controllare il codice
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Schwibby


Testato


studiati questa guida sul C
http://arduino.cc/playground/Italiano/Newbie

Lesto hai fatto tu questo Wiki ? (lestofante)
e' eccezionale  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

lesto

grazie  :smiley-mr-green:
ma imho il mio fiore all'occhiello è la procedura per installare l'ide valida per qualsiasi sistema linux, in inglese.ù

ps. ma allora qualcuno lo legge il wiki :)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up