www.mikrocontroller.net

Forum: Compiler & IDEs An alle Arduino freaks ;)


Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebes Forum...

ich plage mich nun schon seit einiger zeit mit dem Arduino Uno herum.

Habe schon vieles Versucht konnte den FEhler im Code allerdings nicht 
ausfindig machen. Vielleicht kann mir hier jemand weiterhelfen.

Hier der Code: sollte nomalerweise verständlich sein.

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);

}

char inString[5]; // Space for the string
char string2[] = "start\0";
char inChar; // Where to store the character read
byte index = 0; // Index into array; where to store the character
int i = 1;

void loop()
{
   if(Serial.available() > 0)
// there you know there is data
   {
   for(index=0; index<5; index++)
   {
       inChar = Serial.read(); // Read a character
       inString[index] = inChar; // Store it

       inString[i] = '\0'; // Null terminate the string
             i++;
   }
   }


  if (inString[0] == 's' && inString[1]== 't' && inString[2] == 'a' && 
inString[3] == 'r' && inString[4] == 't')
  {
     Serial.println("Start empfangen\n");
     digitalWrite(13, HIGH);   // set the LED on
  }
  if (inString==string2)
  {
     Serial.write("Start empfangen\n");
     digitalWrite(13, HIGH);   // set the LED on
  }

  if (!strcmp(inString, string2))
  {
     Serial.write("Stopp empfangen\n");
     digitalWrite(13, LOW);   // set the LED off
  }
}

mfg

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> char inString[5]; // Space for the string
> char string2[] = "start\0";
> ...
>  if (inString==string2)

Diese if-Bedingung ist nie wahr. Sollte der C-Compiler aber anmosern. 
C-Grundlagen lesen. Stringvergleiche macht man mit strcmp() oder besser 
strncmp().

> char string2[] = "start\0";
>  if (!strcmp(inString, string2))
>  {
>     Serial.write("Stopp empfangen\n");

Seltsame Programmlogik. Doku zu strcmp lesen: 0 bedeutet Inhalt von 
inString und string2 sind gleich. sting2 enthält "start" - Warum dann 
stoppen?

>   if(Serial.available() > 0)
>   {
>     for(index=0; index<5; index++)
>     {
>       ...
>     }
>   }
>
>   if (inString[0] ...)
>   {
>     ...
>   }
>   if (inString == ...)
>   {
>     ...
>   }
>   if (!strcmp(inString ...)
>   {
>     ...
>   }

Die drei if Abfragen stehen an der falschen Stelle. Derzeit können sie 
aufgerufen werden, wenn die for-Schleife noch nicht aktiv war.

Die Ergebnisabfrage gehört entweder mit in den if(Serial.available() > 
0) Anweisungsblock nach der for-Schleife, oder -besser- in eine eigene 
Funktion, die aufgerufen wird, wenn inString gefüllt ist.

Das Füllen von inString per for-Schleife ist nicht optimal. In dieser 
Zeit ruht dein Restprogramm!

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define MAXSTRING 5
char inString[MAXSTRING+1]; // Space for the string plus Nullbyte
byte index = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  if (Serial.available() > 0 && index < MAXSTRING) {
    inString[index] = Serial.read();
    inString[index+1] = '\0';
    index += 1;
  }

  if ( index == MAXSTRING ) {
    if ( !strcmp(inString, "start") ) {
      Serial.write("Start empfangen\n");
      digitalWrite(13, HIGH);   // set the LED on
      index = 0;
    } else if ( !strcmp(inString, "stopp") ) {
      Serial.write("Stopp empfangen\n");
      digitalWrite(13, LOW);   // set the LED off
      index = 0;
    }
  }
}

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für das Codebeispiel =) genau so etwas wollte ich 
mit meinem Testprogrämmchen erreichen...
Das was du mit "seltsamer Programmlogik" bezeichnet hast war ein fehler 
meinerseits...
Mir war der Stringvergleich mit:
"if (inString==string2)"
bisher aus nicht bekannt sollte aber laut:
http://arduino.cc/en/Tutorial/StringComparisonOperators
möglich sein.
Nichtsdesto trotz konnte ich dein beispiel soweit abändern, dass es nun 
das mach was es soll =) Vielen Dank

Autor: A.H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem Beispiel wurden die Strings aber auch nicht als "char *", wie sie 
in C üblich, sondern als C++ "String" Klasse deklariert. Diese Klasse 
hat dann wahrscheinlich einen Haufen Operatoren wie "=" und "==" 
überladen, damit Zuweisungen und Vergleiche automagisch funktionieren.

Autor: Mario (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal ich bins wieder...benötige nochmals hilfe...

und zwar gehts darum, dass mir mein programm eine string von 3 
dreistelligen zufallszahlen schicken soll welche mittels # getrrennt 
sind.

soweit so gut...das programm schick mir einen string allerdings kommt 
danach noch irgend ein buchstabe oder ein hieroglyph und ich komme 
einfach nicht dahinter wieso.

#include <stdio.h>
#define MAXSTRING 6
char inString[MAXSTRING+1]; // Space for the string plus Nullbyte
byte index = 0;
int value1=0;
int value2=0;
int value3=0;
char outString[12];

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);

}

void loop()
{
  if (Serial.available() > 0 && index < MAXSTRING) {
    inString[index] = Serial.read();
    inString[index+1] = '\0';
    index += 1;
  }

  if ( index == MAXSTRING ) {
    if ( !strcmp(inString, "start\r") )
    {
      value1 = random(100, 200);
      value2 = random(100, 200);
      value3 = random(100, 200);
      delay(1000);
      sprintf(outString,"%d#%d#%d\r",value1,value2,value3);
      Serial.write(outString);

      index = 0;
    } else if ( !strcmp(inString, "stopp\r") )
    {
      //Serial.println("Stopp empfangen\n");
      Serial.write("Stopp empfangen\n");
      index = 0;
    }
  }
}

Anbei noch ein Screenshot der Ausgabe im Terminal Programm.

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     sprintf(outString,"%d#%d#%d\r",value1,value2,value3);
                                 ^^
>     Serial.write(outString);
> ...
>     Serial.write("Stopp empfangen\n");
                                   ^^

Dein reguläres Zeilenende beim Senden ist anscheinend ein '\n'. Beim 
Aufbau des Textes mit den Zufallszahlen benutzt du aber ein '\r'. Das 
ist möglicherweise dein "irgend ein buchstabe oder ein hieroglyph"

Du kannst die Ausgabe auf dem PC auch mal mitloggen lassen und mit dem 
Hexeditor nachsehen, welches Zeichen kommt. Es gibt auch 
Terminalprogramme für RS232, die direkt den Hexcode für empfangene 
Zeichen anzeigen können.

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stopp zurück, du hast ja schon einen Screenshot.

> char outString[12];
> sprintf(outString,"%d#%d#%d\r",value1,value2,value3);

123#456#789'\r''\0'
^^^^^^^^^^^^^^^^^^^

Sind 13 Zeichen und outString[12] ist zu klein
Buffer Overflow!

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schön für die Hilfe...peinlicher fehler auch noch dazu...nun funzt 
endlich alles =)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.