Forum: Mikrocontroller und Digitale Elektronik hdc1080 humity 40bit serial number


von Tino K. (blumengiesser)


Lesenswert?

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?

von Max G. (l0wside) Benutzerseite


Lesenswert?

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.

von Tino K. (blumengiesser)


Lesenswert?

OK und wie wandele ich eine uint64_t Variable in einen String um?

von Jim M. (turboj)


Lesenswert?

Sowas mache ich immer als Hexadezimal, das kann man mit ein, zwei 
Handvoll Zeilen selber schreiben. Dezimal braucht das kein Mensch...

von Stefan F. (Gast)


Lesenswert?

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

von Max G. (l0wside) Benutzerseite


Lesenswert?

Auf welchem System (Arduino? STM32? AVR?) bist du unterwegs? Und vor 
allem: was willst du mit der Information anfangen?

von Stefan F. (Gast)


Lesenswert?

Sorry, das leere puts() muss weg. Hat sich irgendwie da herein gemogelt.

von Tino K. (blumengiesser)


Lesenswert?

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

von Max M. (jens2001)


Lesenswert?

Tino K. schrieb:
> umwandeln in einen string, ala ltoa() geht
> aber nicht,

WARUM??? willst du das in einen String umwandeln?

von Stefan F. (Gast)


Lesenswert?

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

von Tino K. (blumengiesser)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

> 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?

von Tino K. (blumengiesser)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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

von georg (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.