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
  Nachtwächter - Fehler im Sketch juergen001 15 322 24.04.2018 06:54
Letzter Beitrag: juergen001
  Sound File BluPxl 9 396 23.03.2018 15:21
Letzter Beitrag: Tommy56
  RH_RF95.h: No such file or directory n88 2 306 15.02.2018 08:49
Letzter Beitrag: Fips
  Brauch hilfe bei einnem Sketch MrMagoo 10 557 11.02.2018 13:49
Letzter Beitrag: hotsystems
  Funktionen und deren Rückgabewerte, Verständnisproblem HarryS 6 362 07.02.2018 22:58
Letzter Beitrag: Tommy56
  Sketch kleiner und effektiver gestalten? Gonmaus 4 434 26.01.2018 23:41
Letzter Beitrag: Tommy56
  Arduino Sketch mit ArduBlock öffnen bertl68 4 536 04.01.2018 15:08
Letzter Beitrag: Binary1
  Übergabe von Arrays an Funktionen Marcel 4 580 31.10.2017 13:28
Letzter Beitrag: Tommy56
  Werden ungenutzte Funktionen weg optimiert? BennIY 1 461 03.10.2017 09:06
Letzter Beitrag: Tommy56
  NeoPixels: Sketch will nicht - Problem mit delay? Zabsi 5 841 22.08.2017 15:17
Letzter Beitrag: Tommy56

Gehe zu:


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