Pages: [1]   Go Down
Author Topic: Daten(IP) von SD lesen  (Read 1124 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !?

Code:
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":
Code:
192.168.178.1

Gruß
Jens
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3091
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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. 
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Michael,

also Serial sehen ich die komplette IP Adresse smiley-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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 174
Posts: 3288
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie wäre es denn einfach mit:
Code:
byte ip[4];
ip[0]=getIntFromString (charBuffer, 1);
ip[1]=getIntFromString (charBuffer, 2);
ip[2]=getIntFromString (charBuffer, 3);
ip[3]=getIntFromString (charBuffer, 4);
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

@mkl0815 das ist schon klar aber das Skript von Jurs

Code:
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:

Code:
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...!
« Last Edit: January 19, 2013, 04:24:01 am by Lan-Police » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3091
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab mal aus testsd ein getsd gemacht:

Code:
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
« Last Edit: January 19, 2013, 10:24:54 am by michael_x » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 174
Posts: 3288
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:

#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) {}
Logged

Pages: [1]   Go Up
Jump to: