Daten(IP) von SD lesen

Hallo,

ich nutzte die SdFat.h und möchte gerne aus der "test.txt" eine IP-Adresse auslesen um diesen an das Ethernet Shield zu übergeben.
Habe es mit folgendem Code getestet aber das schein nicht der Richtige Weg zu sein !?

void testsd()
{
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
  if (!myFile.open("test.txt", O_READ)) 
    {
    sd.errorHalt("opening test.txt for read failed");
    }
  int data;
  while ((data = myFile.read()) > 0) Serial.print(data);
  myFile.close(); 
  
}

So wie ich das sehe brauch ich ein Byte Array für das Ethernet Shield ?

Inhalt der "test.txt":

192.168.178.1

Gruß
Jens

Habe es mit folgendem Code getestet aber das schein nicht der Richtige Weg zu sein !?

Ich weiss nicht, warum das nicht der richtige Weg sein soll, und rate mal du siehst im SerialMonitor

49575046....

Wenn das richtig geraten ist, lob mich bitte, und lass dir sagen, dass der Weg richtig ist soweit, aber du noch nicht am Ziel bist.
In deiner Datei steht ein Text, den liest du Buchstabe für Buchstabe, und musst dann die Punkte erkennen und aus dem was dazwischen ist, Zahlen machen.
Dafür gibt es mehrere Methoden.

  • Entweder erst alles in ein char array einlesen, die Punkte in EndeKennungen (0) wandeln und die 4 Teile mit atoi in Zahlen wandeln
  • Oder gleich beim zeichenweisen Einlesen:
    Wenn du sicher bist, dass der Buchstabe eine Ziffer zwischen '0' und '9' ist, subtrahiere einfach '0' ( oder eine 48, das ist das gleiche) und du erhältst eine Zahl zwischen 0 und 9.
    Wenn das nächste Zeichen nicht '0' ... '9' ist (also ein Punkt oder ein Zeilenende oder ein Leerzeichen oder ... ) , ist ist die Zahl fertig.
    Sonst *10 und den nächsten Buchstaben genauso behandeln und dazuaddieren.

Hallo Michael,

also Serial sehen ich die komplette IP Adresse :wink:

Danke für deine Ideen ... leider kann ich als "Newbie" damit nicht viel anfangen. Bin da aus Zeitmangel auf der Suche nach einem "Code Schnipsel" den ich mir Anpassen kann vllt. hat jemand was für mich ?

Gruß
Jens

Lan-Police:
Schnipsel" den ich mir Anpassen kann vllt. hat jemand was für mich ?

Du möchtest die IP-Adresse als Klartext in der Form "Dezimalzahlen als Text mit Punkten getrennt" in eine Datei schreiben und ein Programm soll Dir daraus die einzelnen 4 Bytes machen?

Vor kurzem habe ich mir eine absolut geniale Funktion gemacht, um positive Integer-Zahlen aus einem Char-Array auszulesen, die Funktion habe ich hier im Forum im Zusammenhang mit Kommandoauswertung über die serielle Schnittstelle auch schon gepostet gehabt.

int getIntFromString (char *stringWithInt, byte num)
// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string
// num=2, returns 2nd number from the string, and so on
{
  char *tail; 
  while (num>0)
  {
    num--;
    // skip non-digits
    while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)) stringWithInt++;
    tail=stringWithInt;
    // find digits
    while ((isdigit(*tail))&&(*tail!=0)) tail++;
    if (num>0) stringWithInt=tail; // new search string is the string after that number
  }  
  return(strtol(stringWithInt, &tail, 0));
}

D.h. Du liest Dir Deine Klartext-IP am besten in ein Char-Array ein, sagen wir mal es heißt "charBuffer",
und dann holst Du die vier Werte entsprechend raus:
byte1=getIntFromString (charBuffer, 1);
byte2=getIntFromString (charBuffer, 2);
byte3=getIntFromString (charBuffer, 3);
byte4=getIntFromString (charBuffer, 4);

So ungefähr?

Hallo jurs,

danke für deine Mühe, leider hab ich keine Idee wie ich den Inhalt der Datei in ein Char-Array bekomme!?

Gruß
Jens

Wie wäre es denn einfach mit:

byte ip[4];
ip[0]=getIntFromString (charBuffer, 1);
ip[1]=getIntFromString (charBuffer, 2);
ip[2]=getIntFromString (charBuffer, 3);
ip[3]=getIntFromString (charBuffer, 4);

Hallo,

@mkl0815 das ist schon klar aber das Skript von Jurs

int getIntFromString (char *stringWithInt, byte num)
// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string
// num=2, returns 2nd number from the string, and so on
{
  char *tail; 
  while (num>0)
  {
    num--;
    // skip non-digits
    while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)) stringWithInt++;
    tail=stringWithInt;
    // find digits
    while ((isdigit(*tail))&&(*tail!=0)) tail++;
    if (num>0) stringWithInt=tail; // new search string is the string after that number
  }  
  return(strtol(stringWithInt, &tail, 0));
}

liest ja keine TXT Datei aus !?

Hab da meine Probleme das mit:

void testsd()
{
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
  if (!myFile.open("test.txt", O_READ)) 
    {
    sd.errorHalt("opening test.txt for read failed");
    }
  int data;
  while ((data = myFile.read()) > 0) Serial.print(data);
  myFile.close(); 
  
}

zu verbinden...!

Hab mal aus testsd ein getsd gemacht:

char buffer[50];

void getsd()
{
  byte pos = 0;
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
  if (!myFile.open("test.txt", O_READ)) 
    {
    sd.errorHalt("opening test.txt for read failed");
    }
  int data;
  while ((data = myFile.read()) > 0 && pos < 49) buffer[pos++]= (char)data;
  myFile.close();   
  buffer[pos] = 0; // Endekennung
}

Ist das dein Problem gewesen ?

Edit: immer noch ungetestet, aber zumindest besser

Lan-Police:
liest ja keine TXT Datei aus !?

Hab da meine Probleme das mit:
...
zu verbinden...!

Lernen, lernen, lernen!

Hier habe ich Dir mal das Auslesen einer Datei auf SD-Karte mittels SdFat-Library und das Splitten von Bytes aus dem gelesenen String in einzelne Zahlen kombiniert.

Durch Entfernen der Kommentarstriche bei nur einer einzigen Zeile kannst Du mit dem folgenden Code sogar die Datei auf der Karte mit der gewünschten IP-Nummer beschreiben, denn auch eine Schreibfunktion ist dabei.

#include <SdFat.h>
SdFat sd;
//------------------------------------------------------------------------------
// store error strings in flash memory
#define error(s) sd.errorHalt_P(PSTR(s))
//------------------------------------------------------------------------------
// filename for storing configuration data
#define CONFIGFILE "config.txt"
//------------------------------------------------------------------------------
// 16 is minimum buffer size to store 4 3-digit numbers, three dots and trailing \0 character
char ipNumBuf[16];  

//------------------------------------------------------------------------------
void readIpConfigFile (char *fn)
{
  SdFile rdfile(fn, O_READ); // open file for reading
  // check for error opening file
  if (!rdfile.isOpen()) error("readIPConfigFile");
  int bytesRead = rdfile.fgets(ipNumBuf, sizeof(ipNumBuf));;
  rdfile.close();
}

//------------------------------------------------------------------------------
void makeIpConfigFile() {
  SdFile wrfile(CONFIGFILE, O_WRITE | O_CREAT | O_TRUNC);   // create or open test file
  // check for error opening file
  if (!wrfile.isOpen()) error("MakeConfigFile");
  wrfile.write_P(PSTR("123.145.156.178\n"));
  wrfile.close();
}
//------------------------------------------------------------------------------

int getIntFromString (char *stringWithInt, byte num)
// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string
// num=2, returns 2nd number from the string, and so on
{
  char *tail; 
  while (num>0)
  {
    num--;
    // skip non-digits
    while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)) stringWithInt++;
    tail=stringWithInt;
    // find digits
    while ((isdigit(*tail))&&(*tail!=0)) tail++;
    if (num>0) stringWithInt=tail; // new search string is the string after that number
  }  
  return(strtol(stringWithInt, &tail, 0));
}  
//------------------------------------------------------------------------------


void setup(void) {
  Serial.begin(9600);
  // the next three lines are for Arduino UNO and Ethernet Shield
  pinMode(10, OUTPUT);  // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH);  // but turn off the W5100 chip!
  if (!sd.begin(4,SPI_HALF_SPEED)) sd.initErrorHalt();
  
// remove comment from the next line to create the config file
//  makeIpConfigFile();

  readIpConfigFile(CONFIGFILE);
  Serial.print("IP number: ");
  Serial.println(ipNumBuf);
  Serial.println();
  Serial.print("Die einzelnen Bytes der IP-Nummer: ");
  for (int i=0;i<4;i++)
  {
     Serial.print(getIntFromString(ipNumBuf, i+1));
     Serial.print("  ");
  }
  Serial.println();
}

void loop(void) {}