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
> 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!
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
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.
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.
> 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.
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!
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.