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.
hallo, wenn's einfach gehen soll: mit sprintf in ein array und dieses raus auf die leitung. umgekehrt mit scanf einlesen. bye kosmo
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
@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.
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.
Wie schreibst du die Double-Variable in das EEPROM? Genauso kannste die auf den USART ausgeben/einlesen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.