Forum: Mikrocontroller und Digitale Elektronik uint8_t* konvertieren


von Patrick S. (schaff91)


Lesenswert?

Hallo Experten,

Wie kann ich ein uint8_t* in ein double umwandeln.

Danke schon im Vorraus,

mfg Patrick

von Bernhard R. (barnyhh)


Lesenswert?

Ein Codeschnipsel:

uint8_t x_uint;
uint8_t * p_x_uint = & x_uint;

double x_double = (double) p_x_uint;


Viel Erfolg
Bernhard

von Lord Z. (lordziu)


Lesenswert?

Durch casting. (Ohne jetzt deinen Controller  Umgebung  
Programmiersprache zu kennen)
1
double val = (double)(*u_val);

von P. S. (Gast)


Lesenswert?

Patrick Schaffler schrieb:

> Wie kann ich ein uint8_t* in ein double umwandeln.

Wenn du die Frage nicht richtig (oder wenigstens ausfuehrlich) 
formulierst, wirst du nur falsche Antworten bekommen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Patrick Schaffler schrieb:
> Hallo Experten,
>
> Wie kann ich ein uint8_t* in ein double umwandeln.

Ich kann mir beim besten Willen nicht vorstellen, dass du einen 
Pointerwert in einen double umwandeln willst.

Ich könnte mir aber vorstellen, dass du
* einen String hast, das in einem uint8_t Array abgelegt ist und du
  den double benötigst, der dieser Text-Repräsentierung entspricht

  Also:  "123.4"  -> 123.4

  strtod ist hier dein Freund

* tatsächlich einen Wert ausgerechnet hast, der jetzt in einem uint8_t
  steht, du einen Pointer darauf hast, und du jetzt diesen Wert als
  double benötigst.

  uint8_t  x = 256 / 3;
  uint8_t* p_x = &x;

  double value = *p_x;


Also: Was ist es?

von Patrick S. (schaff91)


Lesenswert?

Mein Kompasssensor liefert mir über den I2C-Bus einen Wert (uint8_t*)
zurück. Damit ich diesen Wert weiterverarbeiten kann muss ich ihn jedoch
umwandeln. Der Quellcode des Programmes ist in C++ geschrieben.

Ich habe nur recht wenig ahnung in diesem Themengebiet und bitte euch 
daher mir genaue Angaben und eine genaue Erklärung zu geben.

von Peter (Gast)


Lesenswert?

Patrick Schaffler schrieb:
> liefert mir über den I2C-Bus einen Wert (uint8_t*)

über ein bus kann bestimmt kein Zeiger ankommen. Zeig uns doch mal den 
Quellcode von der STelle an der du die Daten von dem I2C Bus bekommst.

von Karl H. (kbuchegg)


Lesenswert?

Patrick Schaffler schrieb:
> Mein Kompasssensor liefert mir über den I2C-Bus einen Wert (uint8_t*)
> zurück.

Dein Kompassensor liefert alles mögliche. Aber mit Sicherheit keinen 
uint8_t*

Du magst vielleicht im Datenblatt des Sensors eine Funktion gesehen 
haben, die die Kommunikation mit dem Sonsor abwickelt. Und diese 
Funktion hat einen uint8_t* als Parameter.
Das bedeutet dann in diesem Zusammenhang, dass du einen uint8_t (ohne 
den *) bereitstellen musst, und diese Adresse dieses uint8_t der 
Funktion übergeben musst, damit diese den ausgelesenen Wert dort 
hineinschreiben kann.
Normaler C/C++ Übergabemechanismus: Call per 'Referenz', indem ein 
Pointer auf die Zielvariable übergeben wird. (Nicht zu verwechseln mit 
C++ Referenzen)

Das kann so sein. Muss aber nicht.

Beende endlich das Rätselraten und zeig deinen Code.

von Patrick S. (schaff91)


Lesenswert?

Über dem I2C-Bus wird folgendens gesendet:

  void send(uint8_t address, uint8_t data);
  void send(uint8_t address, uint8_t* data, int length);
  void get(uint8_t address, uint8_t* data, int length);

Ich brauche den Wert welcher in data steht. Und dieser ist vom Typ 
uint8_t*.
Oder bin ich falsch informiert?

von STK500-Besitzer (Gast)


Lesenswert?

>Ich brauche den Wert welcher in data steht. Und dieser ist vom Typ
>uint8_t*.

Dir fehlen C-Grundlagen.

von Patrick S. (schaff91)


Angehängte Dateien:

Lesenswert?

Quellcode:

#include "qfixSoccerBoard.h"
#include "qfixI2C.h"

SoccerBoard board;
I2C I2C;

int main()
{
  double richtung;
        uint8_t* data;
  i2c.send(192, 1);    //192-Kompassadresse, 1-Register
  i2c.get(192, data, 1);          //Auslesen unter "data"


  richtung = data/0.70833;  //zur weiterverarbeitung nötig
}


Im Anhang befindet sich noch die Headerdatei des I2C_Busses.

von Peter (Gast)


Lesenswert?

jetzt bitte noch das Datenbaltt von den Sensor, denn man kann nicht 
erkennen wie viele bytes von den Sensor gesenet werden. Welchen wert 
setzt du denn bei length ein?

von Patrick S. (schaff91)


Angehängte Dateien:

Lesenswert?

Das Datenblatt

von Karl H. (kbuchegg)


Lesenswert?

Patrick Schaffler schrieb:
> Über dem I2C-Bus wird folgendens gesendet:
>
>   void send(uint8_t address, uint8_t data);
>   void send(uint8_t address, uint8_t* data, int length);
>   void get(uint8_t address, uint8_t* data, int length);
>
> Ich brauche den Wert welcher in data steht. Und dieser ist vom Typ
> uint8_t*.
> Oder bin ich falsch informiert?

Du bist falsch informiert.

Die Benutzung ist so gedacht
1
int main()
2
{
3
  uint8_t  data[40];
4
5
6
  get( 192, data, sizeof(data) );
7
}

Ganz normaler C Übergabemechanismus im Falle von Arrays. Ob die 40 
ausreichen oder nicht, kann man so nicht sagen. Das musst du dir aus dem 
Datenblatt raussuchen, wieviele Bytes der Sensor wirklich sendet.

von Peter (Gast)


Lesenswert?

nach lesen des Datenblattes würde ich sagen das es so gehen müsste
1
int main()
2
{
3
  double richtung;
4
  uint8_t data;
5
  i2c.send(192, 1);    //192-Kompassadresse, 1-Register
6
  i2c.get(192, &data, 1);          //Auslesen unter "data"
7
8
9
  richtung = (double)data/0.70833;  //zur weiterverarbeitung nötig
10
}

Die nächste Frage ist ob du wirklich glücklich mit dem Double wirst.

von Patrick S. (schaff91)


Lesenswert?

Peter schrieb:
> int main()
> {
>   double richtung;
>   uint8_t data;
>   i2c.send(192, 1);    //192-Kompassadresse, 1-Register
>   i2c.get(192, &data, 1);          //Auslesen unter "data"
>
>
>   richtung = (double)data/0.70833;  //zur weiterverarbeitung nötig
> }

Danke Peter!
Wenn ich das Programm so ausführe funktioniert es.

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.