Hallo, Ich habe hier das Arduino Mega Board (ATmea1280), und versuche Daten über einen UART einzulesen, zu bearbeiten, und wieder auszugeben. Die Daten, die ich empfange kommen als ASCII Ziechen rein, sollen mit einem NMEA-Präfix versehen werden, und am anderen UART mit geringerer Bausrate wieder als ASCII Zeichen ausgegeben werden. Nun lese ich die Daten in einem Unterprogramm aus, und will sie im Hauptprogramm verarbeiten. Wenn ich jetzt aber mit Hilfe von strcat Textteile zufügen will, kommt nur noch Mist raus. Wenn ich dikret ausgebe, stimmen die Werte aber. Scheinbar wird auch das Einlesen der Werte langsamer, jedenfalls ändern sich die Werte nicht mehr so schnell in der Ausgabe, als ohne strcat. Auch wenn ich Messwert, den ich aus der Einlesefunktion ja als double übergebe, in einen String wandle, und dann mit einer for schleife an entsprechender Stelle wieder ein Komma einfügen will, kommt nur noch mist dabei heraus. Wie muss man das Programmieren, damit da keine Daten verloren gehen?
Jürgen Papadopolis schrieb: > und will sie im Hauptprogramm verarbeiten. Wenn > ich jetzt aber mit Hilfe von strcat Textteile zufügen will, kommt nur > noch Mist raus. Herzeigen! ALles andere ist sinnlos > Auch wenn ich Messwert, den ich aus der Einlesefunktion ja als double > übergebe, in einen String wandle, und dann mit einer for schleife an > entsprechender Stelle wieder ein Komma einfügen will, kommt nur noch > mist dabei heraus. > Wie muss man das Programmieren, damit da keine Daten verloren gehen? Richtig :-) Rück erst mal deine Funktionen richtig ein, da sieht man dann schon eine Menge
1 | double FOG(void) |
2 | {
|
3 | if (Serial1.available()) { |
4 | int inByte = Serial1.read(); |
5 | |
6 | if (inByte == 13){ |
7 | for (int i=0; i<=19; i++){ |
8 | int inByte = Serial1.read(); |
9 | Data[i]=inByte; |
10 | }
|
11 | }
|
12 | |
13 | for (int i=5; i<=11; i++){ |
14 | Data1[i-5] = Data[i]; |
15 | }
|
16 | }
|
17 | |
18 | FOGdbl = atof(Data1); |
19 | return FOGdbl; |
20 | }
|
Du wartest jedesmal auf 1 Zeichen. Wenn das ein Return war, wartest du auf weitere 20 Zeichen und speicherst die zwischen. Aber was, wenn das kein Return war? Dann holst du dir munter 7 Zeichen aus dem Data Array (egal was da zu diesem Zeitpunkt drinnen steht) und wandelst das in einen float. Zumindest versuchst du es. Denn funktionieren würde das nur dann, wenn in Data1 auch ein korrekter C-String stehen würde. Das tut er aber nicht, dazu müsste der mit einem '\0' Zeichen beendet sein. Auch ist mir nicht wirklich klar, wie du von einem Data1 Array einen float lesen kannst, wenn doch die Serielle gar nicht verfügbar ist und Data1 daher gar nie nicht irgendeinen String bekommen hat.
1 | if (Serial1.available()) { |
2 | ...
|
3 | }
|
4 | |
5 | FOGdbl = atof(Data1); // angenommen Serial1.available() hat false |
6 | // zurückgegeben. Was steht dann in Data1?
|
7 | return FOGdbl; |
8 | }
|
Schreib dir das, was du tun möchtest erst mal im deutschen Klartext in
Form von Kommentaren hin. Und erst dann setzt du dich daran und überstzt
den Klartext nach C.
> Wie muss man das Programmieren, damit da keine Daten verloren gehen?
Wenn du mit geringerer Baudrate wieder ausgibst, musst du dir eine
Strategie überlegen, wie du deinen Zwischenspeicher wieder aufräumst.
Wenn du ein Lager hast, indem LKW alle 1/2 Stunde 20 Paletten bringen,
jedoch ein Arbeiter nur alle 2 Stunden 1 Palette abholt, wird es dir
irgendwann dein Lager sprengen.
Oh Sorry, das hatte so lange nicht geklappt, dass ich etwas rumprobiert hatte. Da hab ich mittlerweile die Übersicht verloren fürchte ich. Ich mach heute erstmal Feierabend, und melde mich morgen wieder.
Karl heinz Buchegger schrieb: > Schreib dir das, was du tun möchtest erst mal im deutschen Klartext in > Form von Kommentaren hin. Und erst dann setzt du dich daran und überstzt > den Klartext nach C. Ich denke mal, deine Funktion sollte so in etwa aussehen (Ist sicher gestellt, dass ein einzulesender Datensatz immer aus 20 Zeichen besteht?) double FOG() { // unter der Annahme, dass das nächste einzulesende Zeichen // der Anfang des nächsten Datensatzes ist, die nächsten // 20 Zeichen einlesen und verarbeiten. // Und das geht so: // lies ein Zeichen ein // war es ein Return? // Konnten 20 Zeichen eingelesen werden? // wenn ja, dann ist der Datensatz komplett. Bearbeite // ihn, indem die Zahl von der Stelle 5 an aufwärts in // einen float gewandelt wird und diese float returniert wird // Wenn keine 20 Zeichen eingelesen wurden, dann stimmte die Annahme // nicht, dass der Datensatz mit Betreten der Funktion beginnt // -> fang von vorne an. Das nächste Zeichen ist das erste Zeichen // des Datensatzes. }
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.