Forum: Mikrocontroller und Digitale Elektronik array in float umwandeln.


von Martin L. (peon5)


Lesenswert?

Hallo allerseits,
ich bin totaler Anfänger was das Programmieren angeht und gerade 
ziemlich verzweifelt.

Ich habe mir ein APRS Modem zur Funkübertragung von GPS Koordinaten nach 
der Anleitung von Mark Qvist (http://unsigned.io/micromodem/) gebaut. 
Jetzt versuche ich den Code soweit zu modifizieren, dass ich den 
ankommenden Text (die Koordinaten) irgendwie in eine Float Variable 
bekomme um damit weiter arbeiten zu können.
Unter "void processPacket()" wird das Array "incomingPacket.info" über 
die Serielle Schnittstelle gedruckt. Wie kann ich an dieser Stelle aus 
den Daten eine Float Variable machen?
Kann mir jemand hierbei helfen?

Besten Gruß
Martin




boolean gotPacket = false;
AX25Msg incomingPacket;
uint8_t *packetData;
void aprs_msg_callback(struct AX25Msg *msg) {

  if (!gotPacket) {
    gotPacket = true;
    memcpy(&incomingPacket, msg, sizeof(AX25Msg));
    if (freeMemory() > msg->len) {
      packetData = (uint8_t*)malloc(msg->len);
      memcpy(packetData, msg->info, msg->len);
      incomingPacket.info = packetData;
    } else {
      gotPacket = false;
    }
  }
}

void processPacket() {
  if (gotPacket) {
    gotPacket = false;

    for (int i = 0; i < incomingPacket.len; i++) {
      Serial.write(incomingPacket.info[i]);
    }
    Serial.println("");

    // Remeber to free memory for our buffer!
    free(packetData);


  }
}

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

von welchem Typ ist AX25Msg?

wenn packetdata ein integer ist, hau die Einzelpakete doch nacheinander 
als string zusammen und mach dann am Ende eine Typenumwandlung Richtung 
float

(wenn ich das Problem richtig verstanden habe)

von nobody (Gast)


Lesenswert?

Was spricht gegen die Funktion atof?

http://en.cppreference.com/w/c/string/byte/atof

von Martin Lindemeier (Gast)


Lesenswert?

Danke erst einmal für die Antworten.
Direkt mit atof geht es nicht. Wenn ich folgendes eingebe
"double tmp =atof(incomingPacket.info[i]);"
kommt
"invalid conversion from 'uint8_t {aka unsigned char}' to 'const char*' 
[-fpermissive]" dabei heraus.

AX25Msg habe ich in einer der zugehörigen Libraries gefunden. Es scheint 
keine Variable, sondern eine Funtion zu sein.

"typedef struct AX25Msg {
    AX25Call src;
    AX25Call dst;
    AX25Call rpt_list[AX25_MAX_RPT];
    uint8_t  rpt_count;
    uint8_t  rpt_flags;
    uint16_t ctrl;
    uint8_t  pid;
    const uint8_t *info;
    size_t len;
} AX25Msg;
"
packetData ist als "uint8_t *packetData;" deklariert. Also ein "unsigned 
char".

Der Sketch scheint das meiste ja schon zu können. Immerhin setzt er 
mittels for-Schleife das (char)-Array für den Serial.write zusammen. 
Kann ich das analog zu Mikes Vorschlag irgendwie als Nicht-Array-Char 
ausgeben und dann mittels atof oder so umwandeln...
Sorry, wenn ich an dieser Stelle mit gefährlichem Halbwissen um mich 
werfe...

von Daniel F. (Gast)


Lesenswert?

AX25Msg ist offensichtlich ein struct

info ist ein Pointer auf uint8_t Daten.

Gehört len vielleicht zu info?

Gruß
Daniel

von Martin Lindemeier (Gast)


Lesenswert?

len müsste die Länge oder Größe des Arrays sein. Weiter oben im Code 
nutzt er es glaube ich
"
if (!gotPacket) {
    gotPacket = true;
    memcpy(&incomingPacket, msg, sizeof(AX25Msg));
    if (freeMemory() > msg->len) {
      packetData = (uint8_t*)malloc(msg->len);
      memcpy(packetData, msg->info, msg->len);
      incomingPacket.info = packetData;
"

Gruß
Martin

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.