UART lesen, Wert bearbeiten und UART schreiben

Moin,
Ich steh vor einem Problem, bei dem ich nicht weiterkomme.
Ich lese mit dem Mega Board eine UART aus, will den Wert bearbeiten, und am anderen UART ausgeben.
Der Wert, den ich lese besteht aus ASCII Zeichen. Das letzte davon ist ein Flag, das anzeigt, ob die Daten gültig sind. 1= gültig !=1 unglütig
Wenn ich das jetzt auslese und abfrage, ob das letzte Byte (index19 in char array), wird so erstmal nix ausgegeben. Warum weiß ich nicht.
Wenn ich mir Byte 19 anzeigen lasse, ist es 1. Trotzdem sendet der UART nicht. Jetzt hatte ich schon einen else zweig geschrieben, der für den fall, dass das Flag !=1 ist ein B an den Messwert hängt.
Da hatte ich aber vergessen “else” hinzuschreiben. Seit dem funktioniert das ganze aber. Nur dass immer der gültige Wert ausgegeben wird, und derselbe nochmal mit B versehen.
Ich verstehs nicht.
Kann sich das mal einer ansehen?

int inByte = 0;
char Data[20];
char Data1[20];

void setup() {
  Serial.begin(38400);
  Serial1.begin(38400);
}

void loop() {   
    if (Serial1.available()) {
      int inByte = Serial1.read();  
      if (inByte == 13){
          for (int i=0; i<=19; i++){ 
           int inByte = Serial1.read();
            Data[i]=inByte;
          }
       }
     
      if (Data[19] =='1'){
        Serial.print("$TIROT,");    
        for (int i=7; i<=12; i++){
           Data1[i-7] = Data[i];
        }     
        Serial.print(Data1);
        Serial.print(",A\n\r");
      }
     
// Hier hatte ich eigentlich das "else" vergessen. Wenn Byte 19 eine 1
// ist, ist der Messert gültig. Der Ausgangsstring soll dann mit A
// enden. Sonst sollte der folgende Teil ein B ranhängen. 
   
        Serial.print("$TIROT,");    
        for (int i=7; i<=12; i++){
           Data1[i-7] = Data[i];
        }      
        Serial.print(Data1);
        Serial.print(",B\n\r");   
    }
 }

Hallo juergenp,

Dein Programm etwas verbessert (z.B. Serial.available() immer bevor Zeichen lesen):

char Data[20];
char Data1[20];

void setup() {
Serial.begin(38400);
Serial1.begin(38400);
}

void loop() {
int inByte;
int i;

// warten bis CR empfangen
inByte = 0;
do {
if (Serial1.available()) inByte = Serial1.read();
} while (inByte != 13);
i = 0;
do {
// erst prüfrn, ob ein Zeichen empfangen wurde
if (Serial1.available()) {
Data = Serial1.read();

  • i++;*

  • }*

  • } while (i<20);*

  • Serial.print("$TIROT,"); *

  • for (int i=7; i<=12; i++){*
    _ Data1[i-7] = Data*;_
    _
    }_
    _
    // eine Zeichenkette muss mit 0 enden*_
    * Data1[i-7] = 0; *
    * Serial.print(Data1);*
    * // je nach Empfangsergebnis A oder B dranhängen*
    * if (Data[19] == ‘1’) Serial.print(",A\n\r");*
    * else Serial.print(",B\n\r");*
    }
    Da ich noch kein Board habe ist das ungetestet.
    Viele Güße
    mike_pa

Ok, das Funktioniert soweit ganz gut. Jetzt habe ich aber das Problem, dass ich die Daten schneller empfange(38400Baud), als sende(9600). Wie mache ich das denn? Ich hab schon was gelesen von Ringbuffern, aber ehrlich gesagt habe ich das nicht wirklich verstanden...