Forum: Mikrocontroller und Digitale Elektronik Arduino Serielle Schnittstelle Fehlersuche


von Flo D. (floflovaldo)


Lesenswert?

Hallo zusammen,

ich habe folgender Code, der nicht so ganz funktioniert. Ich sende über 
die Schnittstelle vom PC "DHTT" und bekomme keine Antwort zurück. Die 
Ausgabe in der Methode loop bekomme ich, also "Testausgabe", aber 
irgendwie gibt er gar nichts in der Methode Einlesen aus. Nicht das 
"Echo: " und auch nicht den Beispielwert "xx.xx".

Würde mich über Hilfe freuen.

Gruß Florian
1
String Input="";                  // Input von Serieller Schnittstelle
2
String Befehl="NOP";              // Befehl aus Input
3
int Parameter=0;                  // Parameter aus Input
4
int Wert=0;                       // Rückgabewert Analog
5
6
//OneWire DSPin(2);                 // Datenleitung DS18xxx -> Pin 2
7
char buffer[20] = "";             // Speicherbereich für Datenkonvertierung
8
9
void setup() {
10
  Serial.begin(9600);
11
}
12
13
void loop() {
14
  if (Serial.available()) Einlesen();
15
  Serial.println("Testausgabe");
16
  delay(2000);
17
}
18
19
void Einlesen() {
20
  while (Serial.read());
21
    {
22
      char ch = Serial.read();
23
      Serial.print("Echo: ");
24
      Serial.println(ch);
25
      Input=Input+ch;
26
      Serial.println(Input);
27
      delay(10);
28
    }
29
    Befehl = Input.substring(0, 4);
30
    //Serial.println("Befehl: " + Befehl);
31
    Parameter = (Input.substring(4, 6)).toInt();
32
    //Serial.print("Parameter: ");
33
    //Serial.orintln("Parameter,DEC);
34
    ausfuehren();                                     
35
    //Serial.println(Befehl + Parameter + " = " + Wert);
36
37
    Input="";
38
}
39
40
void ausfuehren() {
41
  if (Befehl=="DHTT")
42
  {
43
    Serial.print("xx.xx");
44
  }
45
}

von Dieter S. (Gast)


Lesenswert?

Ich habe mir nicht den kompletten Sketch angesehen, aber Strings musst 
du mit "strcmp" vergleichen, nicht mit "==".

von Flo D. (floflovaldo)


Lesenswert?

und wie mache ich das dann ganz genau. Direkt ersetzten?

von Kaj (Gast)


Lesenswert?

Einfach mal in die beschreibung der funktion gucken...
http://www.cplusplus.com/reference/cstring/strcmp/

von Norbert (Gast)


Lesenswert?

Florian D. schrieb:
> Hallo zusammen,
>
> ich habe folgender Code, der nicht so ganz funktioniert. Ich sende über
> die Schnittstelle vom PC "DHTT" und bekomme keine Antwort zurück. Die
> Ausgabe in der Methode loop bekomme ich, also "Testausgabe", aber
> irgendwie gibt er gar nichts in der Methode Einlesen aus. Nicht das
> "Echo: " und auch nicht den Beispielwert "xx.xx".
>
1
void Einlesen() {
2
   while (Serial.read());

Nimm mal das Semikolon dort weg!

von Dieter S. (Gast)


Lesenswert?

Florian D. schrieb:
> und wie mache ich das dann ganz genau. Direkt ersetzten?

Ganz einfach. Google benutzen und Basics lernen.

von Michael U. (amiga)


Lesenswert?

Hallo,

  if (Serial.available()) Einlesen();
...
  while (Serial.read());
    {
      char ch = Serial.read();

Semikolen wurde ja schon gesagt, außerdem rufst Du bei einem verfügbaren 
Zeichen Einlesen() auf.
  while (Serial.read());
Diese Zeile holt jetzt das Zeichen.
      char ch = Serial.read();
Danach liest Du nochmal ein Zeichen, da dürfte aber keins mehr sein, 
weil Du das ja oben schon gelesen hast.

Gruß aus Berlin
Michael

von Flo D. (floflovaldo)


Lesenswert?

Hallo,

Ja das mit dem Semikolon ist nun klar.

Aber wie würdest du das dann anderst machen. Ich versteh schon was du 
meinst aber ich wüsste jetzt nicht wie ich es ändern soll.

Gruß Florian

von Marc S. (marc_s86)


Lesenswert?

1
char ch;
2
while (ch = Serial.read())
3
...

von Ulrich F. (Gast)


Lesenswert?

Als Arduino Fan möchte ich dazu auch mal was sagen:
1
 while (Serial.available())
2
{
3
  // tuwas
4
}

Ansonsten fummelst du da mit String Objekten rum.
Das bedeutet dauernde "dynamische Speicherverwaltung". Problematisch!
Der String Instanz kann man auch einmal einen Buffer zuweisen. Dann 
lässt sie das sein.

Dieter S. schrieb:
> Ich habe mir nicht den kompletten Sketch angesehen, aber Strings musst
> du mit "strcmp" vergleichen, nicht mit "==".
Die String Klasse kann einiges....
https://www.arduino.cc/en/Reference/StringComparison

von Flo D. (floflovaldo)


Lesenswert?

Hallo, ich habe das das Semikolon raus und hab geguckt das ich die 
Zeichen nicht zweimal auslesen:
1
String Input="";                  // Input von Serieller Schnittstelle
2
String Befehl="NOP";              // Befehl aus Input
3
int Parameter=0;                  // Parameter aus Input
4
int Wert=0;                       // Rückgabewert Analog
5
char ch;
6
7
//OneWire DSPin(2);                 // Datenleitung DS18xxx -> Pin 2
8
char buffer[20] = "";             // Speicherbereich für Datenkonvertierung
9
10
void setup() {
11
  Serial.begin(9600);
12
}
13
14
void loop() {
15
  if (Serial.available()) Einlesen();
16
  Serial.println("Testausgabe");
17
  delay(2000);
18
}
19
20
void Einlesen() {
21
  while (ch = Serial.read())
22
    {
23
      //char ch = Serial.read();
24
      //Serial.print("Echo: ");
25
      //Serial.println(ch);
26
      Input=Input+ch;
27
      //Serial.println(Input);
28
      delay(10);
29
    }
30
    Befehl = Input.substring(0, 4);
31
    //Serial.println("Befehl: " + Befehl);
32
    Parameter = (Input.substring(4, 6)).toInt();
33
    //Serial.print("Parameter: ");
34
    //Serial.orintln("Parameter,DEC);
35
    ausfuehren();                                     
36
    //Serial.println(Befehl + Parameter + " = " + Wert);
37
38
    Input="";
39
}
40
41
void ausfuehren() {
42
  if (Befehl=="DHTT")
43
  {
44
    Serial.print("xx.xx");
45
  }
46
}

Leider funktioniert es immer noch nicht. Ich bekomme genau die gleiche 
Ausgabe wie ganz am Anfang

von Marc S. (marc_s86)


Lesenswert?

dann lass die debug ausgaben doch mal drin. kommt da was?

von Dieter F. (Gast)


Lesenswert?

Probier mal so:
1
String Input="";                  // Input von Serieller Schnittstelle
2
boolean stringComplete = false;   // whether the string is complete
3
String Befehl="NOP";              // Befehl aus Input
4
int Parameter=0;                  // Parameter aus Input
5
int Wert=0;                       // Rückgabewert Analog
6
7
8
//OneWire DSPin(2);                 // Datenleitung DS18xxx -> Pin 2
9
char buffer[20] = "";             // Speicherbereich für Datenkonvertierung
10
11
void setup() 
12
{
13
  Serial.begin(9600);
14
  Serial.println("Testausgabe");
15
  Input.reserve(20);
16
}
17
18
void loop() 
19
{
20
  if (stringComplete) 
21
  {
22
    Serial.println(Input);
23
    // clear the string:
24
    ausfuehren();
25
    Input = "";
26
    stringComplete = false;
27
  }
28
}
29
30
/*
31
  SerialEvent occurs whenever a new data comes in the
32
 hardware serial RX.  This routine is run between each
33
 time loop() runs, so using delay inside loop can delay
34
 response.  Multiple bytes of data may be available.
35
 */
36
void serialEvent() {
37
  while (Serial.available()) 
38
  {
39
    // get the new byte:
40
    char inChar = (char)Serial.read();
41
    // add it to the inputString:
42
    Input += inChar;
43
    // if the incoming character is a newline, set a flag
44
    // so the main loop can do something about it:
45
    if (inChar == '\n') 
46
    {
47
      stringComplete = true;
48
    }
49
  }
50
}
51
52
void ausfuehren() 
53
{
54
  if (Input == "DHTT\n")
55
  {
56
    Serial.println("xx.xx");
57
  }
58
  else
59
    Serial.println("nop");
60
}

und stelle Deinen serialmonitor auf "Neue Zeile"

von Tom Thomsen (Gast)


Lesenswert?

Mal 'ne ganz blöde Frage: Wozu gibt es in der Arduino IDE im Menü /Datei 
den Menüpunkt Beispiele.

Vielleicht sollte man erstmal mit einem funktionierenden einfachen 
Beispiel aus /04.Communication/ anfangen und das schrittweise in 
Richtung der gewünschten Funktion umbauen. Damit lassen sich viele 
grundlegende Fehler vermeiden.

von Flo D. (floflovaldo)


Lesenswert?

Hallo,

ich habe es jetzt zum laufen gebracht, stehe jedoch jetzt vor einem 
anderen Problem in dem Sketch. Ich will ein DS18S20 Sensor einbinden. 
Jedoch bekomme ich folgendes angezeigt wenn ich es aufn Arduino 
Hochladen will: "'show_temperature' was not declared in this scope". 
Dies betrifft Zeile 62 im Code, diese wird rot markiert.

Ich will wenn ich nun OneWire01 an den Arduino sende eben die Temperatur 
des Sensors ausgelesen und angezeigt bekommen.
1
#include <OneWire.h>
2
#include <DallasTemperature.h>
3
4
#define DS18B20_PIN 2
5
6
OneWire oneWire(DS18B20_PIN);
7
DallasTemperature sensors(&oneWire);
8
9
int BlinkRate=0;                                         // Anzahl Blinken für Tests 
10
String Input="";                                         // Input von Serieller Schnittstelle 
11
String Befehl="NOP";                                     //Befehl aus Input 
12
int Parameter=0;                                         //Parameter aus Input 
13
int Wert=0;                                              //Rückgabewert Analog
14
15
char buffer[20] = "";                                    // Speicherbereich für Datenkonvertierung
16
17
18
void setup()
19
{
20
  Serial.begin(9600);
21
  sensors.begin();
22
}  
23
24
void loop()
25
{
26
  if (Serial.available()) Einlesen();
27
  //Serial.println("Testausgabe");
28
  //delay(2000);
29
}
30
31
32
33
void Einlesen()
34
{
35
    while (Serial.available())
36
       {
37
       char ch = Serial.read();
38
       //Serial.print("Echo: ");
39
       //Serial.println(ch);
40
       Input=Input+ch;
41
       //Serial.println(Input);
42
       delay(10);
43
       }
44
       Befehl = Input.substring(0, 4);
45
       //Serial.println("Befehl: " + Befehl);
46
       Parameter = (Input.substring(4, 6)).toInt();
47
       //Serial.print("Parameter: ");
48
       //Serial.println(Parameter,DEC);
49
       ausfuehren();
50
       //Serial.println(Befehl + Parameter + " = " + Wert);
51
       
52
       Input="";
53
}
54
55
void ausfuehren()
56
{
57
58
  if (Befehl=="OW01")
59
  {
60
   sensors.requestTemperatures();
61
  for(byte i=0;i<sensors.getDeviceCount();i++){ 
62
    show_temperature(i+1,sensors.getTempCByIndex(i));
63
  }
64
  else
65
  {
66
   Serial.println("ERROR");
67
  }
68
}
69
70
void show_temperature(byte num,float temp){
71
  //Serial.print("Sensor ");
72
  Serial.print(num);
73
  Serial.print(": ");
74
  Serial.println(temp);
75
  //Serial.print(" ");  
76
  //Serial.write(176);  
77
  //Serial.println("C");
78
}

von Ulrich F. (Gast)


Lesenswert?

Florian D. schrieb:
> "'show_temperature' was not declared in this scope".

Die Meldung passt nicht zum Code!
> expected '}' before 'else'
sagts bei mir

von Flo D. (floflovaldo)


Lesenswert?

Das ist was es bei mir anzeigt:

HANS:64: error: expected '}' before 'else'

   else

   ^

exit status 1
'show_temperature' was not declared in this scope

Und was ist mit dem ersten gemeint, Habe doch ein } vor dem else

von google (Gast)


Lesenswert?

Zähl mal die Zahl der öffnenden geschweiften Klammern im IF-Teil und 
dann die Zahl der ... aaah ;-)

  {
   sensors.requestTemperatures();
  for(byte i=0;i<sensors.getDeviceCount();i++){
    show_temperature(i+1,sensors.getTempCByIndex(i));
  }

von Ulrich F. (Gast)


Lesenswert?

Florian D. schrieb:
> Das ist was es bei mir anzeigt:

Tipp:
Wenn du 2 Fehlermeldungen bekommst, dann genau in dieser Reihenfolge 
bearbeiten. Denn der 2te könnte ein Folgefehler sein, welcher nur auf 
Grund des ersten Fehlers auftritt.

von Flo D. (floflovaldo)


Lesenswert?

Danke, funktioniert.

von Flo D. (floflovaldo)


Lesenswert?

Hat jemand schon oft mit den Sensoren DS18S20 gearbeitet. Im oben 
gesehen Code ist es ja so dass wenn ich OW01 an den Arduino sende dann 
der Temperatursensor ausgelesen wird.

Man kann ja mehrere von denen an den gleichen Pin anschließen, das habe 
ich ebenfalls schon gemacht (siehe Code oben, die werden ja nummeriert). 
Nun möchte ich aber zum Beispiel bei "OW01" den einen Sensor, der sich 
z.B. im Haus befindet auslesen und wenn ich Alternativ "OW02" an den 
Arduino sende, den zweiten Auslesen, der z.B. draußen ist.

Kann mir da jemand helfen oder wie der ausgelesen wird?

von Falk B. (falk)


Lesenswert?


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.