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!
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 | }
|
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.