INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Variablen Seriel.Read
16.01.2014, 11:49
Beitrag #1
Variablen Seriel.Read
Hallo ich habe folgendes Problem ich möchte das Arduino Due, als digitalen Ausgansport, nutzen.
Dafür möchte ich über die Serielle Schnittstellen die Jeweilige Variable setzten zB.: Port A soll der zweite Ausgang an sein 010 = ‚a2‘ leider ließt bei meinen Programm der Arduino immer nur das erste Zeichen ist bestimmt ein Simpler Fehler also wer mir helfen kann wäre ganz nett Danke.

void setup()
{

Serial.begin(9600);
for (int thisPin = 12; thisPin < 6; thisPin++) {
pinMode(thisPin, OUTPUT);
}
}

void loop() {

if (Serial.available() > 0) // read Serial
{
int in = Serial.read( );
switch (in) {
case 'a0':
digitalWrite(12, LOW);
digitalWrite(13, LOW);
break;
case 'a1':
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
case 'a2':
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
break;
case 'b0':
digitalWrite(14, LOW);
digitalWrite(15, LOW);
break;
case 'b1':
digitalWrite(14, HIGH);
digitalWrite(15, LOW);
case 'b2':
digitalWrite(14, LOW);
digitalWrite(15, HIGH);
break;
default:
for (int thisPin = 2; thisPin < 7; thisPin++) {
digitalWrite(thisPin, LOW);
}
}
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2014, 14:02
Beitrag #2
RE: Variablen Seriel.Read
void setup()
{

Serial.begin(9600);
for (int thisPin = 12; thisPin < 16; thisPin++) {
pinMode(thisPin, OUTPUT);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2014, 14:30
Beitrag #3
RE: Variablen Seriel.Read
Was soll das jetzt ist ja nur der Anfang von meinem Programm
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2014, 18:24
Beitrag #4
RE: Variablen Seriel.Read
Code:
char buffer[10];     //Puffer Array
int bCount = 0;        //Zähler Variable

void setup()
{
    Serial.begin(9600);
}

void loop() {

if (Serial.available() > 0) // Serial Read
    {
    char ch = Serial.read(); //Zeichen von der seriellen Schnittstelle lesen

    buffer[bCount] = ch;    //Gelesenen Zeichen in Puffer Stelle 0 buffer[0] schreiben
    bCount++;                //Zähler erhöhnen
    if (ch == 13){            //wenn Return gesendet wir (CR entspricht ASCII 13)
        bCount = 0;            //Zähler zurücksetzten



        switch (buffer[0]) {    // in buffer Stelle 0 steht a oder b
                                // in buffer Stelle 1 steht 0 oder 1
            case 'a':
            if (buffer[1] == '0'){        //a0
            Serial.println("CASE A0");
            break;}
            else{                        //a1 oder alles andere
            Serial.println("CASE A1");
            break;
            }


            case 'b':
            if (buffer[1] == '0'){
            Serial.println("CASE B0");
            break;}
            else{
            Serial.println("CASE B1");
            break;
            }


            default:            //keine Übereinstimmung in buffer 0
            Serial.println("not found");
        }
    }        
}
}

Den SerialMonitor muss man dann auf Zeilenumbruch (CR) stellen.
Und statt den Serial.println("CASE B1") Statements fügst du deine Ausgangsansteuerung ein.
Das switch Statement in deinem Code kann nur int bzw char verarbeiten, also immer nur ein zeichen. und über die Konsole schickt man eigentlich meist ASCII Code, dewegen der Datentyp char [Zeichen].
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2014, 23:48
Beitrag #5
Bug RE: Variablen Seriel.Read
(16.01.2014 14:30)fsteini schrieb:  Was soll das jetzt ist ja nur der Anfang von meinem Programm
In Deiner for-Schleife ist ein Fehler

for (int thisPin = 12; thisPin < 6; thisPin++) {

deshalb wird beim Setup Pin 13 - Pin 16 nicht als Ausgang definiert

ich hatte diesen Fehler nur korrigiert

for (int thisPin = 12; thisPin <16; thisPin++) {
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2014, 09:59 (Dieser Beitrag wurde zuletzt bearbeitet: 17.01.2014 10:23 von Ructus.)
Beitrag #6
RE: Variablen Seriel.Read
Wie Georg schon geschrieben hat ist zusätzlich auch noch ein Fehler bei der Initialierung der Ausgabepins.

Ebenfalls fehlt in deinem case a1 Statement ein break

Nachfolgender Debugging Code soll verdeutlichen warum deine Abfrage auf z.B. 'a1' nicht funktionieren kann. Die Initialisierung und Ansteuerung der Ausgänge habe ich fürs Debugging über die Serielle Schnittstelle auskommentiert.

Code:
int testa0 ='a0';
int testa1 ='a1';
int testa2 ='a2';
int testb0 ='b0';
int testb1 ='b1';
int testb2 ='b2';


void setup()
{

Serial.begin(9600);
//for (int thisPin = 12; thisPin < 16; thisPin++) {
//pinMode(thisPin, OUTPUT);
//}
}

void loop() {

if (Serial.available() > 0) // read Serial
{
int in = Serial.read( );
switch (in) {

// Dieser Code wird so nicht funktionieren, die Variable in nimmt immer nur ein Zeichen auf
case 'a0':
//digitalWrite(12, LOW);
//digitalWrite(13, LOW);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE a0");
break;
case 'a1':
//digitalWrite(12, HIGH);
//digitalWrite(13, LOW);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE a1"); //wird nie zur Ausgabe kommen
break;
case 'a2':
//digitalWrite(12, LOW);
//digitalWrite(13, HIGH);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE a2"); //wird nie zur Ausgabe kommen
break;
case 'b0':
//digitalWrite(14, LOW);
//digitalWrite(15, LOW);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE b0"); //wird nie zur Ausgabe kommen
break;
case 'b1':
//digitalWrite(14, HIGH);
//digitalWrite(15, LOW);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE b1"); //wird nie zur Ausgabe kommen
case 'b2' :
//digitalWrite(14, LOW);
//digitalWrite(15, HIGH);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE b2"); //wird nie zur Ausgabe kommen
break;

//ab hier wir es funktionieren wenn man a, b oder c eingibt.

case 'a':
//digitalWrite(12, LOW);
//digitalWrite(13, LOW);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE a");
break;
case 'b':
//digitalWrite(12, HIGH);
//digitalWrite(13, LOW);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE b");
break;
case 'c':
//digitalWrite(12, LOW);
//digitalWrite(13, HIGH);
Serial.print("erkannt, gesendet: \t");
Serial.println(in);
Serial.println("CASE c");
break;

default:
//for (int thisPin = 2; thisPin < 7; thisPin++) {
//digitalWrite(thisPin, LOW);}
Serial.print("nicht erkannt, gesendet: ");
Serial.println(in);       //wird kein kein gültiges Zeichen erkannt,
Serial.println(testa0);   //wird das gesendete Zeichen ausgegben
Serial.println(testa1);   // ebenfalls werden die int Werte von
Serial.println(testa2);   //a0 bis a2 und b0 bis b2 zu Debuggingzwecken
Serial.println(testb0);   //mit ausgebenen
Serial.println(testb1);
Serial.println(testb2);

}
}
}

Zum Verständnis was bei int testa0='a0' passiert.

Ein int Variable kann auf dem Arduino 2 Byte, also 16 Bit speichern.

Der dezimale Integer Wert lautet nach der Ascii Tabelle für
a=97 und
b=98

für die 0 ergbit sich der Wert 48

97 dez entspricht 01100001 binär
48 dez entspricht 00110000 binär

=>

97d 48d
Highbyte Lowbyte
01100001 00110000

Und somit ergibt sich aus Highbyte und Lowbyte der binäre Wert 0110000100110000 und somit der dezimale Wert 24880.

Der Serial.read() Befehl liest aber immer nur ein Byte von der seriellen Schnittstelle und so kann z.B. der case Fall 'a0' nicht gefunden werden, da in der 'in' Variablen immer nur ein Byte steht, also entweder das 'a' oder die '0'.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Variablen over/underflow "deaktivieren" Scheams 6 223 23.06.2016 16:36
Letzter Beitrag: Scheams
  Anfängerfrage zu Serial.read Erazor 1 561 16.01.2016 23:01
Letzter Beitrag: Pit
Exclamation String Zerlegen in drei Variablen Wampo 4 848 28.12.2015 01:07
Letzter Beitrag: Wampo
  Plausibiltätsprüfung Variablen ??? MaHaI976 10 831 16.10.2015 17:39
Letzter Beitrag: MaHaI976
  [EEPROM.h] Unterschied read()/write() und EEPROM[]? gregors 5 885 19.08.2015 19:59
Letzter Beitrag: gregors
Information Rechnen mit variablen Jim 3 1.825 22.05.2015 16:44
Letzter Beitrag: Jim
  Variablen Fehler bei TFT Display Xwill 1 806 08.05.2015 13:10
Letzter Beitrag: Thorsten Pferdekämper
  Due: freier Speicher für Variablen während der Laufzeit? HaWe 8 1.394 28.04.2015 08:22
Letzter Beitrag: tito-t
  Variablen per WIFI zwischen 3 Arduinos versenden Daewid 4 793 23.04.2015 01:22
Letzter Beitrag: Daewid
  Variablen Typ double, char, long aus ext. EEPROM lesen SternGucker 8 1.533 02.04.2015 08:10
Letzter Beitrag: SternGucker

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste