Forum: Compiler & IDEs An alle Arduino freaks ;)


von Mario (Gast)


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

von Helfer (Gast)


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!

von Helfer (Gast)


Lesenswert?

1
#define MAXSTRING 5
2
char inString[MAXSTRING+1]; // Space for the string plus Nullbyte
3
byte index = 0;
4
5
void setup()
6
{
7
  Serial.begin(9600);
8
  pinMode(13, OUTPUT);
9
}
10
11
void loop()
12
{
13
  if (Serial.available() > 0 && index < MAXSTRING) {
14
    inString[index] = Serial.read();
15
    inString[index+1] = '\0';
16
    index += 1;
17
  }
18
19
  if ( index == MAXSTRING ) {
20
    if ( !strcmp(inString, "start") ) {
21
      Serial.write("Start empfangen\n");
22
      digitalWrite(13, HIGH);   // set the LED on
23
      index = 0;
24
    } else if ( !strcmp(inString, "stopp") ) {
25
      Serial.write("Stopp empfangen\n");
26
      digitalWrite(13, LOW);   // set the LED off
27
      index = 0;
28
    }
29
  }
30
}

von Mario (Gast)


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

von A.H. (Gast)


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.

von Mario (Gast)


Angehängte Dateien:

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.

von Serieller (Gast)


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.

von Serieller (Gast)


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!

von Mario (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.