String seriell empfangen

Hi Leute,

ich habe folgendes Anliegen:

Ich sende einen String an den Arduino Mega (Serial). Dieser wird vom Arduino empfangen und es wird gefragt was empfangen wurde. Je nach empfangenen String sendet dieser einen oder mehrere Befehle an ein anderes Gerät über den Serial1. Dieses führt eine entsprechende Aktion gemäß Befehl aus. Das klappt alles. Jetzt fehlt es aber an der Umsetzung den String mit den Messwerten an Serial1 wieder einzulesen. Es soll auch bei diesem bis zu einem \r gelesen werden. Ich hoffe das Programm ist so kommentiert, dass es verständlich ist.

Den verwendeten Code bitte im unteren Post angucken... Der erste Eintrag war zu undurchsichtig...

lasst euch von der länge des Programms nicht abschrecken!

Ich bin für alle Vorschlage dankbar! An der Stelle wo die Messwerte abgefragt werden soll nun unmittelbar danach der String eingelesen werden.

Ich danke euch schon mal.

Kornfeld:
lasst euch von der länge des Programms nicht abschrecken!

Dann benutze doch CODE TAGS bzw # Buttom oberhalb des Editorfensters und nicht SUB TAG.
Grüße Uwe

Ja beim nächsten mal.. War schon ne Weile nicht mehr hier..

Also nochmal so zum Verständnis... Der Haupteil um den es jetzt geht ist die Bedingung Auto.. der Rest ist mehr oder weniger nur für euch zum nachvollziehen was ich hier mache/ machen möchte.

Es wird wenn "Auto" an Serial gelesen wird also die verschiedenen Parameter eingestellt. Woraufhin die Messung ausgeführt wird. Das dauert dann ein paar Sekunden.. 40s hat gepasst.. während dieser Zeit sendet das Gerät 5 mal pro sekunde einen Status, welcher mich an sich nicht interessiert. Die Messung wird beendet. Danach wird seriell die Messwertabfrage gesendet.. Das Gerät antwortet prompt mit einem 42 Zeichen langen String, welchen ich einlesen möchte und direkt weiter über Serial 1 senden möchte. Die weiterverarbeitung erfolgt dann in Python.

Ich habe das ganze jetzt so probiert (ist jetzt auf "Auto" beschränkt):

char Null = 48;
char Eins = 49;                                        //Buchstaben zum senden festlegen
char Zwei = 50;
char Drei = 51;
char Vier = 52;
char Fuenf = 53;
char Sechs = 54;
char Sieben = 55;
char Acht = 56;
char Neun = 57;
char A = 65;
char B = 66;
char C = 67;
char D = 68;
char F = 70;
char CR = 13;
char LF = 10;
char Semi = 59;
char STX = 2;
char ETX = 3;
String str;

const int SERIAL_BUFFER_SIZE = 81;
char serialBuffer[SERIAL_BUFFER_SIZE];

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

void loop()
{
   if(readSerial())
       processSerial();
}

bool readSerial()
{
	static unsigned int index;

	if(Serial.available() > 0)
	{		
		char c = Serial.read();
		
	        if(c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
		{
			serialBuffer[index++] = c;
		}
                else if(c == '\r')
		{
			serialBuffer[index] = '\0';
			index = 0;
			return true;
		}
	}
	return false;
}

void processSerial()                                                                                      //bis hierhin funktioniert es mit dem einlesen
{

  if(strcmp_P(serialBuffer, PSTR("Auto")) == 0)                                    //wenn der eingelesene String "Auto" ist tue...
  {
    Serial.print(STX);
    Serial.print(Zwei);
    Serial.print(Vier);
    Serial.print(Semi);
    Serial.print(Semi);                                                                                     //Parameter festlegen
    Serial.print(D);
    Serial.print(C);
    Serial.print(ETX);
    
    delay(500);
    
    Serial.print(STX);
    Serial.print(Zwei);
    Serial.print(Zwei);
    Serial.print(Semi);
    Serial.print(Semi);
    Serial.print(D);
    Serial.print(A);
    Serial.print(ETX);
    
    delay(500);
    
    Serial.print(STX);
    Serial.print(Null);                                                                          //Messung starten
    Serial.print(Eins);
    Serial.print(Semi);
    Serial.print(Semi);
    Serial.print(D);
    Serial.print(Sieben);
    Serial.print(ETX);
    
    delay(60000);                                                                      //warten bis Messung vorbei ist 
    
    Serial.print(STX);
    Serial.print(Eins);                                                                    //Messwertabfrage... jetzt kommt der wichtige Teil
    Serial.print(Acht);                                                                   //Die Abfrage wird gesendet und die Antwort kommt auf Rx1 rein
    Serial.print(Semi);                                                                   //Die Antwort kommt nicht alleine während der Messung kommt 5 mal  
    Serial.print(Semi);                                                                  //pro sek. der Status
    Serial.print(D);                                                                         //nach ende wird der status nicht mehr gesendet .. die antwort kommt 
                                                                                                        //einzeln nach der Abfrage also nach dem delay(60000);
    Serial.print(F);                                                                          //Die Antwort soll dann auf Tx1 ausgegeben werden 
    Serial.print(ETX);                                                                     //Dieses hat 42 Zeichen
    delay (100);
    if(Serial1.available() > 0)
    {
      str = Serial1.readStringUntil('\r');
    }
    Serial1.print(str);
  }

  
}

Jetzt passiert dabei aber folgender Fehler.. ich bekomme den letzten Status von den 5 mal pro sekunde ausgegebenen Status über den Serial 1 gesendet.

Wie kann ich das verhindern?

DAnke