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.
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.
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.
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.
Chris72622:
Und genau an diesem Punkt benötige ich ein Tutorial.
Damit kann ich auf Anhieb nicht dienen. Aber mit ein bisschen Logik kann man doch auch etwas anfangen. 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
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