Pages: [1]   Go Down
Author Topic: Brauche Hilfe bei dynamischer Variablenzuweisung  (Read 564 times)
0 Members and 1 Guest are viewing this topic.
Munich
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo, ich habe ein paar SensorAdressen in der Form.

Code:
DeviceAddress sensorAddress[] =
{
  0x10,0x16,0x2E,0x57,0x02,0x08,0x00,0x2F,
  0x10,0x25,0x48,0xC0,0x01,0x08,0x00,0x95,
  0x28,0xC9,0xC6,0xBE,0x03,0x00,0x00,0xC9,
  0x28,0xE3,0xAE,0xBE,0x03,0x00,0x00,0x9F,
  0x10,0x98,0x46,0x57,0x02,0x08,0x00,0xF9,
  0x10,0x59,0x4B,0xC0,0x01,0x08,0x00,0x3E,
};

Ich möchte diese jetzt dynamisch beim starten des Arduino aus einer Textdatei von der SD-Karte laden.
Wie ich Werte zeilenweise auslesen kann weiß ich schon nur schaffe ich es nicht, der Variablen sensorAddress diese zuzuweisen.
Hat jemand einen Tipp für mich?



Danke
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2434
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hat jemand einen Tipp für mich?

Falls die Datei nur vom Arduino lesbar sein muss:

Mache Dir eine Schreibroutine (schreiben der Bytes in eine Datei) und eine Leseroutine (lesen der Bytes aus einer Datei).

Dann schreibe die Daten auf Karte und kommentiere danach die nicht mehr benötigte Schreibroutine im Quelltext aus.

Logged

Munich
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Datei muss nur lesbar sein.
Darum geht es auch nicht. Meine Frage war, wie ich diese Werte in die Variable sensorAddress bekomme.
Logged

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

Ich denke was jurs meinte ist, das Du die Daten nicht als Text "0x16" sondern als einzelnes Byte mit dem Wert 0x16 in die Datei schreiben sollst. Dann kannst Du die Datei Byteweise auslesen und die einzelnen Bytes in Dein Array schreiben. Die Datei ist dann aber binär und kann nicht mit einem einfachen Editor bearbeitet werden.
Mario.
Logged

Munich
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Also anstatt 0x16 nur 16 meinst Du?
Ok aber wie übergebe ich mehrere Werte an diese Variable, da liegt mein Problem.
Logged

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

Jein. In der Datei stehen bei 48 unterschiedlichen Adressen auch nur 48 Bytes, nicht mehr.  Es steht also keine "16" in der Datei, sondern der Wert 16 in einem Byte.
Also sowas in der Art:

Code:
  DeviceAddress sensorAddress[48];

  File dataFile = SD.open("adresses.dat");
  int index = 0;
  if (dataFile) {
    while (dataFile.available() && index < 48) {
      sensorAddress[index] = dataFile.read();
    }
    dataFile.close();
  } 
 Serial.print(index);
 Serial.println(" adresses read from file");
Mario.
Logged

Munich
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das sind aber nicht 48 Adressen sondern in dem Fall 6.
Eine Zeile = eine Adresse.
Logged

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

Das ist trotzdem egal, da die Adressen byteweise gespeichert werden. Dein Array ist auch nur ein Byte-Array.
Im schlimmsten Fall wird es als
Code:
byte adresses[48];
deklariert und dann auf
Code:
(DeviceAddress*) adresses ...
gecastet. Ist zwar nicht schön, sollte aber klappen.
Mario.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2719
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Ist zwar nicht schön, sollte aber klappen
Ja.

Schön ist auch nicht, dass kein Mensch mit notepad die Datei lesen oder gar erstellen kann, weil sie binär ist und es auch keine 6 Zeilen sind sondern nur 48 byte.

Quote
Wie ich Werte zeilenweise auslesen kann weiß ich schon nur schaffe ich es nicht, der Variablen sensorAddress diese zuzuweisen.
Da sollten wir noch dran arbeiten smiley-wink

Code:
void  readAddressFromFile( &DeviceAddress result, File f); // skip spaces and other characters like <CR> and read 8*2 hex digits from File f into result
// Bonus feature: detects comment characters and skips everything after 8 hex numbers until  end of line 

file = SD.open("data.txt");
DeviceAddress sensorAddress[6];
for (int i = 0; i < 6 i++)
{   
    readAddressFromFile( &sensorAddress[i], file );
}

Sowas wäre doch schonmal ein brauchbarer Rahmen.
Ich geh mal davon aus, dass Hex-Zahlen das bevorzugte Format sind.

Das Ganze könnte auch eine Methode der Klasse DeviceAddress sein, aber wir wollen's mal nicht übertreiben mit der Schönheit.

Jetzt zeig mal, wo deine Schwierigkeiten bei der Realisierung von readAddressFromFile sind. Oder, wie du schon die Datei zeilenweise lesen kannst.  smiley-wink
Logged

Munich
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für den Versuch mir zu helfen, aber ich komme absolut nicht zurecht.

Ich habe jetzt die Adressen mit 0x ohne 0x, jeweils zwei Werte durch Komma getrennt, ohne Komma, Komma am Ende kein Komma am Ende, alles versucht.
Nichts funktioniert



Ich lese die Adressen jeder Zeile wie folgt aus.

Code:
void readSensorAddressesFromSD()
{
  SdFile myFile("SENSORS.TXT", O_RDWR);
  char netBuffer[50];
  if (myFile.isOpen())
  {
    int chPos = 0;
    int lineNo = 0;

    while (myFile.available())
    {
      char ch = myFile.read();
      
      if(ch == '\n') // '\r' oder '\n'
      {
        chPos = 0;

        switch(lineNo)
        {
          case 1:
            sscanf(test,"%2x",&sensorAddresses[0]);
            printAddress(sensorAddresses[0]);
          break;
        } // switch
        lineNo++;
      } // if(ch == '\n')
      else if(ch == '\r') {
        // do nothing
      }
      else if(chPos < 50)
      {        
        netBuffer[chPos] = ch;
        chPos++;
        netBuffer[chPos] = 0;
      }
    } // while (myFile.available())
  
    myFile.close();

    int x;
  } // if (myFile.isOpen())
//  else return 0;
}






So kann ich die Adresse eines Sensors auslesen
Code:
// DeviceAddress eines Sensors ausgeben
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
Logged

Pages: [1]   Go Up
Jump to: