https://www.arduino.cc/en/Reference/FileRead
file.read(buf, len)
Hallo,
mich quält mal wieder C++.
Ich habe ein Array:
uint16_t meineWerte[3];
Jetzt will ich das speichern:
x.write(meineWerte[0],6);
Das ist wohl in Ordnung so.
Bloß, wie lese ich das zurück?
Idee:
xyzSet[0]=f.read();
error: incompatible types in assignment of 'int' to 'uint8_t [3] {aka unsigned char [3]}'
xyzSet[0]=f.read();
MfG
https://www.arduino.cc/en/Reference/FileRead
file.read(buf, len)
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Danke!
Funktioniert nur mit
uint8_t meineWerte[6];
oh mist sorry hab das mit uint16 nicht gesehen
Behalte nur immer im Hinterkopf dass es da draußen verschiedene Byte Orders gibt, also MSB und LSB auch mal vertauscht sein könnten .... klar unwichtig für den speziellen Fall will nur darauf hinweisen!
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
deswegen nutzt er ja vorbildlich die expliziten typen
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Ja, HaWe.
Das war das schöne an x86 Assembler. Daten lesen in den Speicher und zugreifen mit 8Bit, 16Bit oder 32Bit - egal, weil Speicher ist Speicher.
So nun dachte ich, Daten einlesen in einem Rutsch, und zugreifen mit:
8Bit-Werten, liest mir ein Byte aus dem Puffer in meine uint8_t -Variable
16Bit-Werten, liest mir zwei Byte aus dem Puffer in meine uint16_t-Variable
geht nur nicht.
Ich habe es umgestellt auf Byte und muss dann shiften und den zweiten Wert nochmal verknüpfen.
- - - Aktualisiert - - -
Ich schlage mich mit den X-Y-Z-Werten des Lagessensors rum.
mit ACX = obj.getX(); bekomme ich einen 16Bit-Wert (anscheinend vorzeichenbehaftet)
obj.getCalculatedX(); liefert normalerweise positive und negative Werte als Float, wenn man das als Serial.print(..) ausgibt.
bei ACX = (uint16_t)obj.getCalculatedX(); bekomme ich aber nur "0"-Werte
bei ACX = obj.getCalculatedX(); ebenfalls
ACX ist dabei uint16_t
Diese Sensorwerte wollte ich einfach einlesen und speichern. Na ja ...
Wobei die Methode getCalculatedX() mit float als Rückgabewert deklariert ist.
Verstehe noch nicht, warum da nur Nullen bei rum kommen.
Jetzt hab ich es: ich bekomme nur Nullen als Nicht-float, weil die Werte so klein sind. 0 bis +1.
Geändert von Moppi (20.05.2019 um 12:46 Uhr)
Zwar gibt es das Credo bei C:Daten lesen in den Speicher und zugreifen mit 8Bit, 16Bit oder 32Bit - egal, weil Speicher ist Speicher.
So nun dachte ich, Daten einlesen in einem Rutsch, und zugreifen mit:
"alles ist ein file!",
das ist bei MCUs aber nicht so einfach, weil du bei Arduino aus einer "Stream class"-enherited "File class" liest (oder schreibst),
jedoch gibt es per Arduino GCC oder avrgcc ja überhaupt kein file System, weder für SD cards noch für sonst irgendwas!
C bietet für FILE* aber auch nur Dinge wie fread() für byte-Blöcke oder (f)scanf() für formatierte Daten,
Arduino Stream allerdings kennt auch Stream.parseInt()
https://www.arduino.cc/reference/en/...treamparseint/
- das wäre vlt auch eine Möglichkeit, allerdings wird das auch nicht viel anderes tun als 2 Bytes lesen, das 1. dann shiften und das 2. dann dazuaddieren (kann man auch in eine eigene Funktion packen)
Das ist so nicht richtig. Das gilt für Unix, oder vergleichbare Systeme. Und die Sprache ist dabei nebensächlich. Richtig heißt es "Für Unix ist alles ein File"
Und auch das hat mit C oder dem benutzten Compiler nichts zu tun. Es fehlt dem Arduino-System ein Betriebssystem, ein Kernel, der ein Filesystem zur Verfügung stellt. Die libc stellt nur ein C-kompatibles Interface für die Systemcalls in den Kernel zur Verfügung.das ist bei MCUs aber nicht so einfach, weil du bei Arduino aus einer "Stream class"-enherited "File class" liest (oder schreibst), jedoch gibt es per Arduino GCC oder avrgcc ja überhaupt kein file System, weder für SD cards noch für sonst irgendwas!
C bietet genau das an, für was jemand eine Funktion geschrieben hat. C selbst kann nichts, außer vorhandene Funktionen aufrufen. Wenn die Arduino-Erfinder Files hätten haben wollen, hätten sie nur die passenden Funktionen schreiben müssen. Am besten (aber nicht notwendigerweise) kompatibel zur Standardlibrary von C.C bietet für FILE* aber auch nur Dinge wie fread() für byte-Blöcke oder (f)scanf() für formatierte Daten,
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Lesezeichen