Ich verwende den HDC1080 von TI für Feuchte und Temperatur. Dieser hat seine individuelle Seriennummer auf 40 Bit verteilt. Diese lässt sich auslesen aber wie verarbeitet man diese mit C weiter? Also alle einzel Register-Bytes zu einer großen 64-bit Zahl zusammenschieben ist klar aber umwandeln in einen String geht doch nicht mehr, da ltoa() nur 32 bit kann!? Oder?
Je nachdem, was du mit den Nummer machen willst: entweder einen Hash drüber rechnen - das ergibt eine Zahl, mit der sich z.B. feststellen lässt, ob der Sensor getauscht wurde. Oder einfach als unsigned char[40] speichern. Vergleiche dann per memcmp() oder Schleife.
OK und wie wandele ich eine uint64_t Variable in einen String um?
Sowas mache ich immer als Hexadezimal, das kann man mit ein, zwei Handvoll Zeilen selber schreiben. Dezimal braucht das kein Mensch...
> Sowas mache ich immer als Hexadezimal
ich auch
1 | uint8_t* seriennummer = whatever; |
2 | oder: |
3 | uint8_t seriennummer[] = {1,2,3,4,5}; |
4 | |
5 | for (int i=0; i<5; i++) |
6 | {
|
7 | printf("%02x", zeiger_auf_seriennummer[i]); |
8 | }
|
9 | puts(); |
Auf welchem System (Arduino? STM32? AVR?) bist du unterwegs? Und vor allem: was willst du mit der Information anfangen?
Sorry, das leere puts() muss weg. Hat sich irgendwie da herein gemogelt.
Also der Sensor wird per Atmel ATmega168PA angesteuert. Die Software ist in C geschrieben. Der Sensor hat 3 Register in denen jeweils 2 Byte stecken. Diese 6 Byte beinhalten 48 Bit von denen 40 Bit die Seriennummer bilden. Jetzt kann man als leichte Operation mit left hift eine Variable füllen, diese ist aber 64Bit dann groß. Damit rechnen muss man ja nicht aber einfach umwandeln in einen string, ala ltoa() geht aber nicht, da zu groß. Geht ja nur für 32Bit Variablen. Frage nochmal: Wie aus dieser immens großen Zahl einen String machen...
Tino K. schrieb: > umwandeln in einen string, ala ltoa() geht > aber nicht, WARUM??? willst du das in einen String umwandeln?
> Wie aus dieser immens großen Zahl einen String machen...
Ich habe Dir doch ein konkretes Code-Beispiel gegeben? Was willst du
denn noch?
Vielleicht noch den Hinweis, dass man Variablen auch casten kann? Aber
das ist gar nicht nötig, wenn Du dir den völlig sinnfreien Aufwand
ersparst, diese Folge von Bytes (=Array) in eine 64Bit Integer Variable
zu konvertieren.
Max M. schrieb: > Tino K. schrieb: >> umwandeln in einen string, ala ltoa() geht >> aber nicht, > > WARUM??? willst du das in einen String umwandeln? weil dies ein Sensor ist, der per Funk spricht und die Nummer gut als ID für die Ganze Einheit herhalten kann. Und per Funk geht nun mal alles nur per String raus...
> Und per Funk geht nun mal alles nur per String raus...
Dann erkläre mir mal, was printf() macht ..... Bingo! Einen String
ausgeben. Den Unterschied zu Sprintf() kennst du, oder?
Stefan U. schrieb: >> Wie aus dieser immens großen Zahl einen String machen... > > Ich habe Dir doch ein konkretes Code-Beispiel gegeben? Was willst du > denn noch? > > Vielleicht noch den Hinweis, dass man Variablen auch casten kann? Aber > das ist gar nicht nötig, wenn Du dir den völlig sinnfreien Aufwand > ersparst, diese Folge von Bytes (=Array) in eine 64Bit Integer Variable > zu konvertieren. Das mit dem Casten habe ich nicht ganz verstanden. Was macht man da genau?
> Das mit dem Casten habe ich nicht ganz verstanden.
Ich glaube ein konkretes Beispiel hilft Dir hier mehr, als ein Verweis
auf die Spezifikation der Sprache C.
Im folgenden Code wird ein Zeiger erzeugt der auf eine Folge von Bytes
Zeigt, welche die 64bit Variable ist.
1 | uint64_t seriennummer=1242352165; |
2 | uint8_t *zeiger=(uint8_t*) &seriennummer; |
3 | for (int i=0; i<8; i++) |
4 | {
|
5 | printf("%02x", zeiger[i]); |
6 | }
|
Hier wird ein Zeiger vom Typ uint64_t* auf einen uint8_t* gecastet, unter den Annahme, dass die 64bit Integer Variable auch als Folge von Bytes gelesen werden kann (was der Fall ist, denn das sind tatsächlich mehrere aufeinander folgende Bytes, nämlich genau 8). Doch nach wie vor halte ich es für quatsch, die Seriennummer überhaupt in eine 64bit Variable abzulegen und dazu auch noch unnötige Bit-Schiebereien durchzuführen. Lese die Seriennummer doch einfach ein ein Array von bytes ein! Dann hast du sie schon in genau dem Format, dass diese for-Schleife zur Ausgabe benötigt.
Tino K. schrieb: > in denen jeweils 2 Byte > stecken Das kannst du ganz trivial in eine 4stellige Hexzahl umwandeln. Aneinanderhängen und fertig. Wo ist das Problem? Georg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.