Brauche Hilfe bei dynamischer Variablenzuweisung

Hallo, ich habe ein paar SensorAdressen in der Form.

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

profwebapps:
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.

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

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.

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

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:

  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.

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

Das ist trotzdem egal, da die Adressen byteweise gespeichert werden. Dein Array ist auch nur ein Byte-Array.
Im schlimmsten Fall wird es als

byte adresses[48];

deklariert und dann auf

(DeviceAddress*) adresses ...

gecastet. Ist zwar nicht schön, sollte aber klappen.
Mario.

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.

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

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. :wink:

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.

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

// 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);
  }
}