Ist ne interessante Frage: Ist es möglich, den Controller dazu zu bewegen, dass er einen via UART empfangenen String, (z.B. die Daten \n terminiert) als C-Code ausführt? Wie realisiere ich dies? BSP: ich bek. vom Terminal oder 2. µC in den rxbuf: "period = 100;\n\r" wie kann ich den µC zwingen, als C-Code period = 100; auszuführen, vorrausgesetzt es besteht eine Variable period? Hoffe ich bekomme Antworten dazu.
Timo P schrieb: > Hoffe ich bekomme Antworten dazu. Dazu bräuchten wir Infos über den verwendeten uC. Die AVRs z.B. können keinen Code aus dem Ram ausführen, sie können höchstens die Befehle interpretieren.
Unmöglich (es sei denn man portiert den gcc...). Einen Parser schreiben um irgendwelche Werte im Programm zu ändern ist hingegen gut möglich. Was hast du vor?
Warum geht es nicht? ich habe eben vor, wie es das beispiel zeigt, Konfigurationen vorzunehmen. Wenn ich meinetwegen mitteilen will, dass eine zeitliche Periode verändert wird, meinetwegen jetzt 100ms betragen soll, dann will ich dem µC das seriell mitteilen. (ATMEGA32) Wenn ich dann umständlich einen String formatiert schicken muss, dann wieder umständlich diesen string zerlegen und in integerwerte umwandeln muss, um variablen zu verändern, ist das doof. Deshalb dachte ich es wäre möglich, via UART eine Zeile zu empfangen, die ich ausführe. Gibt es nicht einen Umweg über ein Makro als define oder sowas? Nach dem Motto #define EXECUTE_CODE char * rxbuf (ka wie ich hier an den Inhalt komme) und dann im code einfach LED_PORT &= ~(1<<RX_LED); EXECUTE_CODE LED_PORT |= (1<<YELLOW_LED);
Timo P schrieb: > Gibt es nicht einen Umweg über ein Makro als define oder sowas? Nach dem > Motto ich glaube du solltest dich erstmal mit den Grundlagen eines compiler beschäftigen. Der komplette C code wird in die Maschienensprache übersetzt. Danach gibt es keine Variabeln, Makros oder Funktionen mehr. Es gibt nur noch Sprünge und Adressen. Schau doch mal in die compilierten Dateien rein, hast du dort mal ein Namen einer Variable gesehen? Damit sollte klar sein das sotwas nicht geht. (zumindest nicht mit C, du könntest ein Basic interpreter verwenden)
Terminal mit Kommandointerpreter Beitrag "Einfacher Interpreter für Komandozeilen/Befehlszeilen" Linksammlung: # Shells für Arduino: * ARSH * AVRSH * BITLASH * FRUITSHELL * BREAKFAST
Kann ich also davon ausgehen, dass ich es nicht schaffe? den via uart übergebenen string als code auszuführen?
> Wenn ich dann umständlich einen String formatiert schicken muss, dann > wieder umständlich diesen string zerlegen und in integerwerte umwandeln > muss, um variablen zu verändern, ist das doof. ROFL. Sorry. > Deshalb dachte ich es wäre möglich, via UART eine Zeile zu empfangen, die > ich ausführe. Kein Problem. Steck die empfangene Zeile in Deinen Interpreter, der erledigt den Rest. Falls Du die paar Zeilen für einen ebensolchen nicht selber schreiben willst, dann nimm einen Compiler-Compiler zur Hand, z.B. sowas wie den yacc [1]. Bisschen Overkill aber was solls ;-) Aber im Ernst: Werd Dir darüber klar, was ∗genau∗ Du ändern können willst, schreib die paar Fälle in eine hypsche Tabelle, setzt ein paar sscanf()s drauf an und gut iss. HTH und nix für ungut. [1] http://de.wikipedia.org/wiki/Yacc
Ein C-Interpreter wäre für diesen Fall IMHO doch völlig übertrieben. Wenn Du nur Wertzuweisungen brauchst, dann zerleg den empfangenen String in zwei Teile, also die Seite vor dem '=' und die Seite nach dem '='. Dann kannst Du den Inhalt der linken Seite nach bekannten Variablennamen durchprüfen und ihnen ggf. den Wert der rechten Seite zuweisen. Also etwas so
1 | char *left, *right; |
2 | parseInput(&left, &right); |
3 | |
4 | if(strcmp_P(left, PSTR("period")) == 0) |
5 | period = atoi(right); |
6 | else if(strcmp_P(left, PSTR("andereVariable")) == 0) |
7 | andereVariable = atoi(right); |
8 | else
|
9 | uart_puts("Fehler: Variable nicht vorhanden!\n"); |
Wenn alle Variablen den gleichen Typ, also z.b. int haben, könnte man auch im Flash eine Map anlegen, die die Variablennamen den Adressen zuordnet. Dann bräuchte man nur in dieser Tabelle die Adresse der Variable nachzuschauen und den Wert an dieser Stelle entsprechend zu setzen. MfG Mark
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.