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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tino K. (blumengiesser)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
OK und wie wandele ich eine uint64_t Variable in einen String um?

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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();

: Bearbeitet durch User
von Max G. (l0wside) Benutzerseite


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

von Stefan ⛄ F. (stefanus)


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

von Tino K. (blumengiesser)


Bewertung
0 lesenswert
nicht 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)


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

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

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Tino K. (blumengiesser)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von georg (Gast)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.