Go Down

Topic: Brauche Hilfe bei dynamischer Variablenzuweisung (Read 782 times) previous topic - next topic

profwebapps

Hallo, ich habe ein paar SensorAdressen in der Form.

Code: [Select]

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

jurs


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.


profwebapps

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

mkl0815

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.

profwebapps

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

mkl0815

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: [Select]

  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.

profwebapps

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

mkl0815

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: [Select]

byte adresses[48];

deklariert und dann auf
Code: [Select]

(DeviceAddress*) adresses ...

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

michael_x

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

Code: [Select]

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.  ;)

profwebapps

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: [Select]
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: [Select]
// 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);
 }
}

Go Up