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
  RH_RF95.h: No such file or directory n88 2 168 15.02.2018 08:49
Letzter Beitrag: Fips
  Brauch hilfe bei einnem Sketch MrMagoo 10 339 11.02.2018 13:49
Letzter Beitrag: hotsystems
  Funktionen und deren Rückgabewerte, Verständnisproblem HarryS 6 271 07.02.2018 22:58
Letzter Beitrag: Tommy56
  Sketch kleiner und effektiver gestalten? Gonmaus 4 313 26.01.2018 23:41
Letzter Beitrag: Tommy56
  Arduino Sketch mit ArduBlock öffnen bertl68 4 363 04.01.2018 15:08
Letzter Beitrag: Binary1
  Übergabe von Arrays an Funktionen Marcel 4 478 31.10.2017 13:28
Letzter Beitrag: Tommy56
  Werden ungenutzte Funktionen weg optimiert? BennIY 1 433 03.10.2017 09:06
Letzter Beitrag: Tommy56
  NeoPixels: Sketch will nicht - Problem mit delay? Zabsi 5 768 22.08.2017 15:17
Letzter Beitrag: Tommy56
Lightbulb mehrere Funktionen mit Schalter mechastef 7 1.149 21.08.2017 22:34
Letzter Beitrag: SkobyMobil
  Brauche einen Sketch zum Testen HDT 12 1.279 22.06.2017 07:37
Letzter Beitrag: HDT

Gehe zu:


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