Tutorial über seriellen Eingangspuffer gesucht

Hallo,

ich suche dringend ein gutes Tutorial, dass sich eingehend mit dem Thema "Serieller Eingangspuffer" befasst.

Es geht mir darum, die eingehenden seriellen Daten eines von mir per Arduino gesteuerten Gerätes zu erfassen und diese zu verarbeiten.

Bsp: Ich schicke "INPT1" an das Gerät, damit dieses auf seinen Videoeingang 1 schaltet. Ich schicke "INPT?" an das Gerät, damit mir dieses eine Rückmeldung in Form von "=1" schickt, damit der Arduino weiss, dass sich das Gerät auf Videoeingang 1 geschaltet hat.

Gruß Chris

Wie ist denn das Gerät mit dem Arduino verbunden? Achte bei serieller Verbindung darauf, das der Arduino mit TTL-Pegel (5V) arbeitet, die meisten RS232 Geräte aber mit größeren Spannungen. Du brauchst also einen Pegelwandler.
Was für ein Tutorial brauchst Du denn? Hardware oder Software?
Mario.

Hallo,

der Arduino ist über einen Max232 mit dem Gerät verbunden und dieses reagiert auch bereits auf Befehle vom Arduino.

Nun habe ich das Problem, dass mir für die Verarbeitung der "Rückmeldungen" das Wissen fehlt.

An Büchern habe ich "Die elektronische Welt mit.." und "Arduino Praxiseinstieg".

Leider konnte ich in den Büchern hierzu nichts finden (oder bin zu doof zum Suchen, oder Beides).

Bin für jeden Tipp dankbar! :slight_smile:

Gruß Chris

Reicht dir die Angabe in der Sprachreferenz nicht? http://arduino.cc/en/Serial/Available

Du hast einen Puffer von 64 Byte, die du dann nach und nach auslesen kannst, ein Beispiel ist auch mit angegeben. Wenn das nicht reicht, müsstest du die Frage konkreter stellen.

Nein, das passt denke ich schon fürs Erste.

Werde mir das einmal genauer anschauen.

Danke.

Gruß Chris

Verwendest Du due SoftSerial, oder Hardware UART?
Schau Dir mal die Doku zur seriellen Konsole an: Serial - Arduino Reference

Einfache Beispiele zum Empfangen finden sich auch hier:

Hardware.

Folgender Code funktioniert nicht und ich weiss nicht warum (LED_13 soll bei Eingang des Wortes "TEST" angehen):

int incomingByte = 0;	// for incoming serial data

#include <Bounce.h>                                          // Bouncing-Library hinzugefügt

int Knopf_1 = 2;                                             // Knopf_1 ist am Anschluss 2
int val_1;                                                   // Bouncerrückgabewert für Knopf 1
int Knopf_1_State;
Bounce Knopf_1_Bouncer = Bounce( Knopf_1,5);

int LED_13 = 13;

void setup() {
	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
digitalWrite(LED_13,LOW);
}

void loop() {

  Knopf_1_Bouncer.update ( );                                // Abfrage des "Knopf_1_Bouncer"-Wertes.
  val_1 = Knopf_1_Bouncer.read();                            // Bouncerrückgabewert für Knopf_1 wird in "val_1" gespeichert

  if (val_1 != Knopf_1_State)                                // Nur dann (<-!), wenn sich der eingelesene Bouncerrückgabewert (also "val_1") gegenüber "Knopf_1_State" geändert hat.. 
  {                          
    if (val_1 == HIGH)                                       // ..und dieser nun "HIGH" ist..
    {
      Serial.print("TEST");                               // ..soll den Image Pro HD aufgrund des Befehls "RTE 1"auf Eingang 1 schalten. "\r" sendet ein [enter].
    }
    }
Knopf_1_State = val_1;                                       // speichern des neuen Zustands in "val_1"

  
	// send data only when you receive data:
	if (Serial.available()==4)
{
		// read the incoming byte:
		incomingByte = Serial.read();
}

if(incomingByte=="TEST")
{
  digitalWrite(LED_13,HIGH);
}

}

Gruß Chris

Edit: Will wohl grad scheinbar zu schnell zu viel. Kann es sein, dass Serial.readBytes() das zu sein scheint, was mich weiter bringt?

Du hast (mindestens) einen Gedankenfehler drin. Der auffälligste ist, dass du wenn 4 Bytes im Puffer sind du nur eines liest. Das incomingByte ist ein einzelnes Zeichen, kann also nie "TEST" werden.

Und genau an diesem Punkt benötige ich ein Tutorial. :frowning:

Gruß Chris

Chris72622:
Und genau an diesem Punkt benötige ich ein Tutorial. :frowning:

Damit kann ich auf Anhieb nicht dienen. Aber mit ein bisschen Logik kann man doch auch etwas anfangen. :wink: Wenn du der Meinung bist, dass dein Empfangspuffer 4 Zeichen enthält, musst du auch alle 4 Zeichen auslesen, also 4 mal Serial.read() aufrufen. Nun ist es etwas müßig, das erste Byte zu überprüfen ob es ein T ist, das zweite zu prüfen ob es sich um ein E handelt usw.. Statt dessen schreibt man die empfangenen Zeichen nacheinander in ein Char-Array und vergleicht am Ende, ob dieses "TEST" enthält.

Probier doch das hier mal als Beispiel, um Deinen String als einzelne Bytes einzulesen:

void setup() {

  Serial.begin(9600);

}

void loop() {

  while (Serial.available() >0) { // es liegt mindestens ein Byte im seriellen Empfangspuffer
    char c= Serial.read(); // byteweises Lesen des Eingangspuffers
    Serial.println(c); // Ausgabe auf den seriellen Monitor
  }
}

Anstatt die Bytes auszugeben, kannst Du sie natürlich auch vergleichen, ob sie dem erwarteten String enstprechen. Dazu gibt es viele Möglichkeiten...

Als Tutorial solltest du dich in C-Grundlagen über einzelne Zeichen ( char ), Texte mit mehreren Zeichen in einem char Array, und char* ( was fast genauso verwendet wird ) einarbeiten :wink:

const int BUFSIZE=5;
char myText[BUFSIZE]; // Platz für 4 Buchstaben und eine Ende-Null
char* p = myText; // Der Pointer p zeigt auf den Anfang von myText, *p ist ein einzelnes Zeichen
while (Serial.available() >0) { // es liegt mindestens ein Byte im seriellen Empfangspuffer
   *p= Serial.read(); // byteweises Lesen des Eingangspuffers
    // Serial.println(*p); // Ausgabe auf den seriellen Monitor
    if ((p-myText) < BUFSIZE) p++;  // p wird erhöht , aber nur wenn es noch keine 5 Buschstaben weiter ist. 
}
*p = 0; // Ende-Kennung
Serial.print(myText); // oder was immer du mit dem kompletten Text machen willst

michael_x:
Als Tutorial solltest du dich in C-Grundlagen über einzelne Zeichen.. ..einarbeiten :wink:

Danke vielmals für Tipp und Code!

Gruß Chris