Hallo Ich würde gerne mit dem Arduino eine txt-datei über die serielle Schnittstelle empfangen Zeile für Zeile und in Strings/Zeile Speichern. Wie kann man das am besten mit Dynamischen Stringarray bewerkstelligen ? Hier mal eine Codefragment: if (Serial.available() > 0) { int i=0; int iWord = 0; while(Serial.available() > 0) { // get incoming byte: tmpSData[iWord] = Serial.read(); if (tmpSData[iWord] == 59) iWord++; delay(2); } lcd.clear(); lcd.setCursor(0,0); lcd.print(tmpSData); }
Und was soll uns das Codefragment nun nutzen? Was darin ist Dein Versuch das Problem zu lösen? Sehe weder ein Array von Strings noch etwelche Dynamik.
Andreas Frauenstein schrieb: > Hallo > > Ich würde gerne mit dem Arduino eine txt-datei über die serielle > Schnittstelle empfangen Zeile für Zeile und in Strings/Zeile Speichern. > > Wie kann man das am besten mit Dynamischen Stringarray bewerkstelligen ? aufwändig. Du brauchst 2 dynamische Dinge: in dem einen dynamischen Array werden Pointer zu den Zeileanfängen gespeichert und jede Zeile selbst wird auch wieder dynamisch allokiert. Im Grunde baust du diese Struktur auf +--------+ | o----------------------->"Teststring1" +--------+ | o-----------------+ +--------+ | | o--------+ +------>"Teststring4" +--------+ | | +----------------->"Dies ist ein Test" Kommt eine neue Zeile dazu, "Schon wieder ein Test", wird zunächst dynamisch Speicher für die Zeile allokiert +--------+ | o----------------------->"Teststring1" +--------+ | o-----------------+ +--------+ | | o--------+ +------>"Teststring4" +--------+ | | +----------------->"Dies ist ein Test" "Schon wieder ein Test" das Pointer Array um 1 Pointer erweitert +--------+ | o----------------------->"Teststring1" +--------+ | o-----------------+ +--------+ | | o--------+ +------>"Teststring4" +--------+ | | | | +--------+ +----------------->"Dies ist ein Test" "Schon wieder ein Test" und ein entsprechender Pointer eingetragen +--------+ | o----------------------->"Teststring1" +--------+ | o-----------------+ +--------+ | | o--------+ +------>"Teststring4" +--------+ | | o | | +----|---+ +----------------->"Dies ist ein Test" | | +------------>"Schon wieder ein Test" Anstelle eines Arrays von Pointern, könnte man (bei gleichzeitig höherem Speicherverbrauch) darüber nachdenken, eine lineare Liste zu programmieren, in der die Pointer abgelegt werden. Eine wieder andere Lösung besteht zb darin, die jeweiligen Listenpointer nicht in einer eigenen Liste zu verwalten, sondern jeden String mit einem Pointer auf den nächsten String zu 'pimpen' und so die Verkettung der Zeilen zu machen. Kommt halt immer auch darauf an, welche Operationen man letzten Endes mit diesem Text machen will. Allerdings ist es das bei weitem einfachste, sich zu überlegen, wozu du das überhaupt brauchst und noch Möglichkeit die Speicherung eines kompletten Textes generell zu vermeiden, wenn es nur irgendwie möglich ist.
Ich glaube so dynamisch muss das dann auch nich sein weil ich einfach aus einer Seriellen Schnittstelle empfangen will: Zeile für Zeile es wird nur einmal eine Textdatei geladen: bei folgendem Code ist ja z.B das Problem das der Inhalt vor dem compilieren in den Speicher geschrieben wird und das die anzahl der Strings feststeht: const char str1[] PROGMEM = "first_A"; const char str2[] PROGMEM = "second_A"; const char str3[] PROGMEM = "third_A"; const char * const strarray1[] PROGMEM = { str1, str2, str3 }; Ich würde aber gerne immer nach einem Semikolon eine Neue Variable erstellen sprich: char str[] = serial.plaplapla oder "fdgrdgdfg" ich brauch unbedingt hilfe ich hab ein Verständnissproblem mit Pointern und Zeigern vor allem wenn es um arrays oder sogar dynamischen arrays geht. Also ich habe ein Controller für eine Maschiene mit LCD Programmiert und jetzt sollen an diese maschiene Jobs oder Programme per Serielle Schnittstelle oder auf sd Karten im txt format gesendet werden im folgenden mal eine Programm : pname=Programm 01; zeit(5s); pmp(an); zeit(15s); san(an); zeit(10s); start_imp(0.5s,0.2s); zeit(10m); stop_imp(); san(aus); zeit(2m); pmp(aus); end; Bei einem Empfang im Arduino sollen Die Programme zum einen Feste im EEprom gespeichert werden und zum anderen in den Variablen damit ich die einzelnen Zeilen im LCD untereinander anzeigen kann und damit ich die Variablen später bei einem Programmstart auswerte und damit den Ablauf steurn kann: Ich hoff ich war verständlich genug g
Andreas Frauenstein schrieb: > Ich glaube so dynamisch muss das dann auch nich sein Wenn du dynamisch irgendwelche Inhalte übertragen willst, kommst du aber nicht darum herum. Allerdings sagt ja kein Mensch (siehe weiter unten), dass du das, was du da empfängst auch in Textform speichern musst :-) > ich brauch unbedingt hilfe ich hab ein Verständnissproblem mit Pointern > und Zeigern vor allem wenn es um arrays oder sogar dynamischen arrays > geht. Tja. Dann wirst du das lernen müssen. Ich kann auch nicht Automechaniker spielen, wenn ich keine Ahnung davon habe, wie das mit den Sychronringen in einem Getriebe funktioniert. > pname=Programm 01; > > zeit(5s); > pmp(an); > zeit(15s); > san(an); > zeit(10s); > start_imp(0.5s,0.2s); > zeit(10m); > stop_imp(); > san(aus); > zeit(2m); > pmp(aus); > > end; Und? Wer sagt, dass diese Programm in Textform gespeichert werden muss? Du hast Kommandos, jedem Kommando verpasst man eine Nummer. Und du hast mögliche Paramater zu den Kommandos. So viele Parameter werden es über die verschiedenen Kommandos gesehen ja nicht sein. Im obigen gibt es zb kein Kommando, welches mehr als 2 Parameter braucht. D.h man definiert sich ein e Struktur, die aus einer Kommandozahl und 2 Parametern besteht und legt sich ein Array mit (hausnummer, was halt noch in den Speicher passt) 500 derartigen Struktureinträgen an. Beim Lesen wird der Text sofort geparst und in dieses Array die jeweilige Kommandonummer samt Parametern abgelegt. Dann brauchst du keine Strings speichern und musst daher auch keinen Speicher dafür allokieren. Und schon ist man das leidige Thema "dynamische Allokierung" los.
ah stimmt hast rech allein den spreicher den ich mir damit ersparre danke aber gibt es in Arduino ist C überhaupt den sintax sruct ?
Irgendwie mach ich was falsch hat vieleicht jemand eine Idee? Der empfängt immer alles sofort. void load_program() { if (Serial.available() > 0) { int i=0; char Word[30]; String tmpString; String progName = ""; while(Serial.available() > 0) { // get incoming byte: Word[i] = Serial.read(); if (Word[i] == 59) { tmpString = Word; if(tmpString.substring(0,5) == "pname") { progName = tmpString.substring(6,tmpString.length() - 7); } //if(tmpString.substring(0,tmpString.indexOf('(')) == "zeit") //{ lcd.clear(); lcd.setCursor(0,0); lcd.print(tmpString.substring(0,tmpString.indexOf('('))); //} i = 0; } i++; delay(2); } } }
> Der empfängt immer alles sofort.
Was mag das wohl bedeuten?
1 | delay(2); |
das will ich nicht gesehen haben.
Okay hab es hinbekommen lag am C++ Uploadercode Ich muste nur auf die Usertasteneingabe warten dann konnte die Schnittstelle nicht frühzeitig geschlossen werden.
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.