INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ANSI-C File IO Funktionen jetzt auch für Sketch
01.03.2015, 21:26 (Dieser Beitrag wurde zuletzt bearbeitet: 02.03.2015 13:35 von HaWe.)
Beitrag #1
ANSI-C File IO Funktionen jetzt auch für Sketch
hallo,
hier für alle, die SD-Files lesen und schreiben möchten so ähnlich wie in ANSI-C, ein Testprogramm:
File-Write und File-Read per
fprintf_ ()
fgets_ ()

zur Unterscheidung von den Original stdio.h-Funktionen (die eine andere FILE * - Implementierung haben) mit angehängtem Unterstrich _

Code:
/*
SD card: fprintf_() und fgets_()
ver 1.01
*/

#include <SPI.h>
#include <SD.h>
#include <stdarg.h>
#include <stdio.h>


// SD Card
#define SD_CSpin 4
File myFile;
char fname[64];

char sdata[128];
char sbuf[128];




//********************************************************************************​***********
// fgets- Varianten: überschreibt optional CR am Schluss mit Nullterminierung
// oder (optional) fügt nach CR eine Nullterminierung ein (ANSI-C Standard)
//********************************************************************************​***********
char * fgets_ ( char * str, int32_t num, File * stream ) {
  int32_t i;
  i=0;
  strcpy(str, "");
  while ( stream->available() && (i<(num-1) )   ) {    
     str[i]=stream->read() ;
     if(str[i] == '\0') goto ok; // end of string: \0
     else
     if(str[i] == '\n')   {      // end of string: CR
         str[i] = '\0';          // optional: CR mit Null-Terminierung überschreiben
         //str[++i] = '\0';      // ansonsten zusätzliche Nullterminierung nach CR einfügen
         goto ok;
     }
     else  ++i;        
  }  
  ok: return(str);
}
//********************************************************************************​***********  



//********************************************************************************​***********  
int fprintf_ ( File * stream, const char fmtstr[], ... ) {
   char      str[1024];
   va_list   arguments;
   int16_t   num;
    
   va_start( arguments, fmtstr);
   num = vsprintf(str, fmtstr, arguments);
   // #debug
   // Serial.println( "string to write to file="); Serial.println( str);    
   stream->print(str);
   va_end( arguments );

   return num;
}
//********************************************************************************​***********  


void setup()
{
  int16_t  p, i, cnt;
  float    x;
  char     sval[20];
  int16_t  ival;
  double   fval;
  
  pinMode(SD_CSpin, OUTPUT);  
  Serial.begin(9600);
  
  sprintf(sbuf,"#: SD Initializing... ");
  Serial.println(sbuf);  

  while(!SD.begin(SD_CSpin) ) {
    sprintf(sbuf,"#: ...SD init failed ");
    Serial.println(sbuf);
    delay(1000);
  }
  
  sprintf(sbuf,"#: ...SD OK !      ");
  Serial.println(sbuf);  
  strcpy(fname,"test.txt");
  
  if (SD.exists(fname) ) {
    sprintf(sbuf,"#: %s exists     ",fname);
    Serial.println(sbuf);  
    
    sprintf(sbuf,"#: Removing %s      ",fname);  
    Serial.println(sbuf);
    
    SD.remove("test.txt");
    // removed: success ?
    if (SD.exists(fname) ) {
       sprintf(sbuf,"#: %s  exists     ",fname);  
       Serial.println(sbuf);  
    }
    else {
       sprintf(sbuf,"#: %s  N/A     ",fname);  
       Serial.println(sbuf);  
     }
  }
    
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.  
  myFile = SD.open(fname, FILE_WRITE);
  
  if (myFile) {
    // if the file opened okay, write to it, then close file:
    sprintf(sbuf,"#: Writing strings to %s ",fname);
    Serial.println(sbuf);
    
    //---------------------------------------------------------------------------------
    // write data to file
    fprintf_(&myFile, "%s\n%d\n%d\n%f\n%f\n", "Teststring", 1, 2, PI, 4.567890);    
    //---------------------------------------------------------------------------------
  
    // close the file:
    myFile.close();
    sprintf(sbuf,"#: %s closed.   ",fname);
    Serial.println(sbuf);  
  }  
  else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);      
  }
  
  Serial.println();
  // re-open the file for reading:
  myFile = SD.open(fname);
  if (myFile) {
    sprintf(sbuf,"#: reading %s ",fname);
    Serial.println(sbuf);  
    
    // read from the file until there's nothing else in it:
    i=0;
    cnt=1;  
    
    while (myFile.available()) {
      strcpy(sdata, "");
      fgets_ ( sdata, 20, &myFile );  
      Serial.print(cnt); Serial.print(": string raw="); Serial.println(sdata);
      Serial.println("rueckformatiert:");
      if (cnt==1) {Serial.print("str  ="); Serial.println(sdata); }
      if (cnt==2) {Serial.print("int  ="); Serial.println(atoi(sdata) ); }
      if (cnt==3) {Serial.print("int  ="); Serial.println(atoi(sdata) ); }
      if (cnt==4) {Serial.print("float="); Serial.println(atof(sdata) ); }
      if (cnt==5) {Serial.print("float="); Serial.println(atof(sdata) ); }
      ++cnt;
    }  
    
    // close the file:
    myFile.close();        
    sprintf(sbuf,"#: %s closed. ",fname);
    Serial.println(sbuf);      
  } else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);      
    Serial.println(sbuf);

  }
}

void loop()
{
  // nothing happens after setup
}



Ausgabe zur Kontrolle:
Code:
#: SD Initializing...
#: ...SD OK !      
#: test.txt exists    
#: Removing test.txt      
#: test.txt  N/A    
#: Writing strings to test.txt
#: test.txt closed.  

#: reading test.txt
1: string raw=Teststring
rueckformatiert:
str  =Teststring
2: string raw=1
rueckformatiert:
int  =1
3: string raw=2
rueckformatiert:
int  =2
4: string raw=3.141593
rueckformatiert:
float=3.14
5: string raw=4.567890
rueckformatiert:
float=4.57
#: test.txt closed.


share and enjoy!

(als nächstes kommt bald noch fscanf_ ()... :
int fscanf ( File * stream, const char * format, ... ) Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  arduino sketch Fuhsering 11 330 30.03.2017 12:47
Letzter Beitrag: hotsystems
Sad Sketch funktioniert auf dem Mega 2560 nicht Frank1234 16 600 26.03.2017 14:15
Letzter Beitrag: oOSpikeOo
  Probleme mit einem Sketch für einen LED Cube 5x5x5 Frank1234 5 257 13.03.2017 12:12
Letzter Beitrag: Tommy56
Rainbow File geht nicht zum compilieren!!!! Jocky 7 302 19.02.2017 20:01
Letzter Beitrag: Binatone
  Problem mit Sketch senden an Uno feuerwehr 5 531 31.01.2017 20:41
Letzter Beitrag: Tommy56
  Sketch geht,geht nicht? malsehen 0 261 25.12.2016 21:24
Letzter Beitrag: malsehen
  No such file Brother Tak 3 186 21.11.2016 10:24
Letzter Beitrag: Brother Tak
  Taster für mehrere Funktionen matthias3579 5 587 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Sketch vom Arduino Board Herunterladen Sarius 2 572 27.07.2016 15:26
Letzter Beitrag: Sarius
  Sketch konnte nicht angelegt werden Sarius 2 475 16.07.2016 15:59
Letzter Beitrag: Sarius

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste