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
  Übergabe von Arrays an Funktionen Marcel 4 362 31.10.2017 13:28
Letzter Beitrag: Tommy56
  Werden ungenutzte Funktionen weg optimiert? BennIY 1 316 03.10.2017 09:06
Letzter Beitrag: Tommy56
  NeoPixels: Sketch will nicht - Problem mit delay? Zabsi 5 481 22.08.2017 15:17
Letzter Beitrag: Tommy56
Lightbulb mehrere Funktionen mit Schalter mechastef 7 895 21.08.2017 22:34
Letzter Beitrag: SkobyMobil
  Brauche einen Sketch zum Testen HDT 12 958 22.06.2017 07:37
Letzter Beitrag: HDT
  Sketch ändern für ACS712 Sandro2504 3 380 04.06.2017 05:55
Letzter Beitrag: Bitklopfer
  arduino sketch Fuhsering 11 882 30.03.2017 12:47
Letzter Beitrag: hotsystems
Sad Sketch funktioniert auf dem Mega 2560 nicht Frank1234 16 1.360 26.03.2017 14:15
Letzter Beitrag: oOSpikeOo
  Probleme mit einem Sketch für einen LED Cube 5x5x5 Frank1234 5 586 13.03.2017 12:12
Letzter Beitrag: Tommy56
Rainbow File geht nicht zum compilieren!!!! Jocky 7 703 19.02.2017 20:01
Letzter Beitrag: Binatone

Gehe zu:


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