Forum: Compiler & IDEs UART Timing Probleme durch Verarbeiten


von Jürgen P. (juergenp)


Angehängte Dateien:

Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jürgen P. (juergenp)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.