Arduino Serielle Schnittstelle Fehlersuche

OP #4427401
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
}
Gast #4427443
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!
#4427458
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
Gast #4427670
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
OP #4427681
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
Gast #4427788
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"
Gast #4427797
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.
OP #4427866
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
}
Gast #4427916
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));
  }
OP #4427944
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren