Forum: Compiler & IDEs double Variable über RS232 übertragen und auswerten?


von Malte S. (Gast)


Lesenswert?

Hallo,

ich möchte gerne eine Variable dessen Wert im EEPROM abgespeichert wird
per RS232 an einen PC übertragen und dort anzeigen bzw. verstellen und
wieder an den µC zurück senden damit dieser den Wert im EEPROM ändern
kann.

Ich möchte quasi die Konfiguration meines Programms ohne neu Flashen zu
müssen über RS232 mit einem selbst geschriebenen Programm ändern.

Kann mir jemand einen Tipp geben wie ich dies möglichst einfach mit
double werten realisieren kann?

Der einfachheit halber hatte ich zuerst überlegt alles mit unsigned char
zu übertragen aber bei einigen Variablen kann ich im µC nur mit double
rechnen bzw. eine Umrechung wäre zu aufwendig und die Auflösung zu
ungenau.
Daher werde ich um eine Double übertragung nicht herum kommen.

Leider hab ich mit doubles bisher wenig Erfahrung und ich finde diese
Rechnung mit Mantisse und co wenig intuitiv...

aber vielleicht weis ja von euch jemand eine einfache und geniale Lösung
für mein Problem.

Gruß
Malte.

von kosmonaut pirx (Gast)


Lesenswert?

hallo,
wenn's einfach gehen soll: mit sprintf in ein array und dieses raus auf 
die leitung. umgekehrt mit scanf einlesen.
bye kosmo

von Mark .. (mork)


Lesenswert?

Hallo Malte,

wenn Du eine double-Variable d hast, dann kanns Du sowas machen:
1
uart_putchar(((char*)&d)[0]);
2
uart_putchar(((char*)&d)[1]);
3
uart_putchar(((char*)&d)[2]);
4
uart_putchar(((char*)&d)[3]);
5
uart_putchar(((char*)&d)[4]);
6
uart_putchar(((char*)&d)[5]);
7
uart_putchar(((char*)&d)[6]);
8
uart_putchar(((char*)&d)[7]);

Das heisst Du lässt den Compiler die Adresse von d nehmen, diese zu 
einer Adresse eines chars casten und dann die 8 bytes wie ein Array 
verschicken.

Der Empfänger schreibt die 8 Bytes in ein Array und macht dann
1
double d=*(double*)(array);

MfG Mark

von Johannes M. (johnny-m)


Lesenswert?

@Mark Prediger:
Das geht aber nur dann gut, wenn das Zielsystem 100%ig das selbe 
double-Format hat und die selbe Reihenfolge der Bytes! Die einzige 
Möglichkeit, die eigentlich immer geht, ist die mit einem ASCII-String, 
den man auch nicht unbedingt mit (s)printf erzeugen muss, sondern mit 
den deutlich sparsameren Funktionen dtostr(f/e) bzw. zurück mit strtod.

von Malte S. (Gast)


Lesenswert?

hm, stimmt schon... irgendwie sind doubles immer blöd... ich werde mal 
sehen, evtl. normiere ich das ganze auch auf unsigned int und übertrage 
alles als 16 Bit Interger variable... ist dann immer noch kürzer als die 
32 Bits eines Doubles... dann schreibe ich meine UART Transmit/Receive 
Funktion eben so um das alles in u-int übertragen wird. Dann ist 
wenigstens wieder alles einheitlich.

Das was ich im µc unbedingt als double speichern muss, kann ich nach dem 
Emfang ja wieder umwandeln, natürlich mit Auflösungverlust aber ich 
rechne mal ob sich das was tut... hoffe das es passt... 8-bit sind 
jedenfalls zu wenig, das weis ich schon.

Wie würdet ihr denn allgemein so ein Protokoll implementieren (jetzt 
nicht als sourcecode, sondern eher als Pseudocode mal grob skiziert) 
wenn es darum geht:

1.) eine reihe von einzelnen Variablen vo µc -> PC zu übertragen um 
diese dort dann in einem Programm bequem ändern zu können

und

2.) das ganze wieder vom PC auf den µc schieben um die geänderte Config 
zu "laden"

gleichzeitig sollte mit dem ganzen auch noch ein Datalogging von 
Sensorinformationen vom µc an den PC (selbes Programm) möglich sein um

1.) Debuggen zu können
und
2.) daten über längere Zeit aufzeichnen zu können, z.B. Temperatur über 
24h oder so... ohne Speicherprobleme zu bekommen oder eben die Daten mit 
Excel und co. grafisch aufzubereiten.

Bin mir da nämlich auch noch nicht ganz schlüssig wie ich das am 
sinnvollsten implementiere.

Gruß
Malte.

von Thilo M. (Gast)


Lesenswert?

Wie schreibst du die Double-Variable in das EEPROM? Genauso kannste die 
auf den USART ausgeben/einlesen.

von R. F. (firo)


Lesenswert?

Hallo,

ich stehe vor einer ähnlichen Aufgabe, werde mich erstmal damit 
beschäftigen müssen. Bei mir müssen Korrekturwerte irgendwie ohne 
Programmierung in eine Mega128. Ich denke mal da bleibt nur das E²PROM 
oder geht da was anderes?

Ob man 24h damit auskommt, hängt ja stark von den zu protokollierenden 
Daten und der Zeitauflösung ab.

Schönen Gruß

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.