Nach Software-Upgrade falsche Ausführung vom EBus-Sketch !

Ich bitte um einen brauchbaren Hinweis für mein Problemchen.

Nach längerer Zeit habe ich das Arduino-Board wieder ausgekramt, um meine Heizung zu überwachen. Die Heizung hat bereits schon einen EBus. Die Heizung gibt fortlaufend mit 2400 baud ihre "Zustände" aus. Mit meiner stümperhaften Umsetzung habe ich die wichtigsten Daten auslesen können. Ich habe aufgrund von vielen Bedingungen die "IF - ELSE - Variante" gewählt. [u]Mit der Arduino IDE 0023 läuft die serielle Ausgabe einwandfrei.[/u] Ich wollte jetzt diese gewonnenen Werte auf eine HTML-Seite übertragen und dazu ein Arduino Ethernet Shield verwenden. Da die Arduino IDE 0023 nicht mehr die aktuellste Software ist, habe ich die IDE 1.0.6 gewählt.

[u]Jetzt meine Frage:[/u] [u]Warum läuft die neue Software bis zur ersten IF - Abfrage ?[/u] Der zweite Wert wird nie erreicht. Wie schon zuvor erwähnt, mit IDE 0023 werden alle noch weiteren Stellen ausgelesen. Zur Kontrolle habe ich einige "prints" eingefügt. Gibt es was bei der neuen IDE zu beachten ? Ich habe zur Verständnis es auch mit Arduino IDE 1.0.1 getestet, jedoch der gleiche Effekt und der Sketch hat ja auch keine Besonderheiten.

Für einen Hinweis wäre ich dankbar.

void loop() {

if (Serial.available() > 0) { wolf = Serial.read();//1.Wert //AW0: if (wolf == 0xF1){ Serial.println(wolf, HEX);//F1 Serial.println("F1-1.Wert"); {goto AW1;} } else if(wolf == 0x10){ Serial.println(wolf, HEX);//W10 Serial.println("10-1.Wert"); {goto AW2;} } else if (wolf == 0x30){ Serial.println(wolf, HEX);//W30 Serial.println("30-1.Wert"); {goto AW1;} }

//**********2.WERT***************** AW1:

wolf = Serial.read();//2.Wert if (wolf == 0xFE){ FE= wolf;//Wert HEX FE Serial.println(wolf, HEX);//F1-FE oder 30-FE Serial.println("F1-FE-2.Wert oder 30-FE-2.Wert"); {goto AWX;} //gibt es 2x

}

AW2: wolf = Serial.read();//2.Wert if (wolf == 0x03){ Serial.println(wolf, HEX);//10-03 Serial.println("10-03-2.Wert"); {goto H05;} } return; //***************3.WERT******** AWX: wolf = Serial.read();//3.Wert if (wolf == 0x08){ Serial.println(wolf, HEX); Serial.println("30+FE+08 3.Wert"); {goto WF1FE08;}

https://github.com/csowada/openhab-bindings/wiki/eBus-Binding

http://knx-user-forum.de/openhab/37438-ebus-binding-heizung-wolf-vaillant.html

Am besten du installierst openHAB auf Raspberry.

Hallo skorpi08,

alle z.Z. angebotenen Softwarevarianten in Bezug auf EBus-Auslesung sind unvollständig und nicht funktionell. Ich kann es mit dem Arduino richtig auslesen und auch auswerten, jedoch nur mit der IDE 0023 und da sind wir wieder bei meiner Frage:

[u]Warum funktioniert der Sketch nicht mit IDE 0.1.0 oder 1.0.6 ??[/u]

Ich weigere mich einen Sketch anzusehen der mit GOTO gespickt ist. Bitte lerne die Grundlagen der C-Programmierung. GOTO braucht man in C und C++ praktisch nicht (außer in einigen Spezialfällen bei komplizierten Sketchen, die aber weder Du noch ich jemals schreiben werden).

Wieso glaubst Du daß der Fehler gerade in dem von Dir geposteten Teil Deines Sketches sein soll, daß Du nicht den gesamten Sketch posten mußt?

Verwendest Du serial.flush() ?

Grüße Uwe

Hallo,

naja, irgendwelche Namen bei manchen Befehlen wurden in der Version ab 1.0 geändert. Aber dann müßtest Du einen Compilerfehler bekommen. Oder Deine Librarys sind nun inkompatibel. Ansonsten, kompletten Sketch und das was Uwe schon sagte.

Oder Du läßt alles bei der alten Version und fängst mit aktueller Version von vorn an ohne Goto und den Mist.

COOL: [u]Warum funktioniert der Sketch nicht mit IDE 0.1.0 oder 1.0.6 ??[/u]

Schau Dir das Changelog an!

Eine große Änderung ab der Version 1.0 ist zum Beispiel, dass das Senden über Serial asynchron erfolgt:

Switching to non-blocking Serial writes with a transmit buffer.

Das bedeutet, dass vor der Version 1.0 ein Befehl wie "Serial.print" die Programmausführung so lange blockiert hat, bis das letzte zu sendende Zeichen gesendet war. D.h. das Zeichen war gesendet, sobald die nächste Programmzeile ausgeführt wird. Aber ab Version 1.0 ist noch überhaupt nichts gesendet, wenn Serial.print aufgerufen wird, sondern bis zu 63 Zeichen landen in einem seriellen Ausgangspuffer, und das Programm macht sofort mit der nächsten Zeile weiter, noch befor tatsächlich etwas gesendet ist. Und das tatsächliche Senden erfolgt interruptgesteuert im Hintergrund.

Das kann beim Timing auf der seriellen Schnittstelle zu erheblichen Unterschieden führen, die in der Programmlogik zu berücksichtigen sind.

Wenn Du ab Version 1.0 oder höher warten möchtest, bis etwas tatsächlich gesendet ist, mußt Du ein Serial.flush() zusätzlich aufrufen. Z.B.:

Serial.println("30-1.Wert");
Serial.flush();

Erst nach der Ausführung von flush() ist sichergestellt, dass der String tatsächlich bereits gesendet ist.

Erst einmal recht vielen Dank für eure Anregungen !

Aber findet ihr es fair, wenn man mich hier gleich runter macht, weil ich so ein Script nur teilweise dargestellt habe oder, dass es bescheiden geschrieben ist!
Ich lerne immer noch und bin über Vorschläge von euch gerne bereit es auch zu ändern. Jedoch habe ich habe zu mindesten mit meinem mageren Wissen ein Script erstellt, was mir die Daten über die EBus-Schnittstelle einer Heizung holt, die jetzt nur auf einer HTML-Seite dargestellt werden soll und das ist doch eigentlich das Wichtigste.
Jetzt noch einmal zu meiner Frage:
Warum läuft das bescheidene Script nicht auf IDE 1.0.1 oder grösser, oder was kann ich ändern, damit das Script funktioniert ?
Danke für euer Interesse.

EBus_Hzg_101.ino (4.61 KB)

Hallo Uwe,

als Forum Moderator stellst du ja ganz schöne Bedingungen !

"Ich weigere mich einen Sketch anzusehen der mit GOTO gespickt ist. [u]Bitte lerne die Grundlagen der C-Programmierung"[/u]

Darf man vorher keineFragen stellen ?

Ich bin immer davon ausgegangen, dass ein Forum auch für Hilfe-Suchende da ist und nicht ausschliesslich für Spitzenprogrammierer.

Gruß Gerd

Das dient nur zum Schutz der User! Der Code in dieser Form mit goto ist …
Natürlich darst du Fragen stellen. Was spricht dagegen, den Sketch erst einmal von dem Elend zu befreien?

Die Antwort hat Doc bereits geliefert. Schau dir die Changelogs an, was sich da getan hat. Mit einer alten Arduino Version scheint es ja gegangen zu sein.

Ach komm... sei unserem Mod bitte nicht so böse ....

Jeder Mensch muss geistige Hygiene betreiben. Und wenn das verweigern von Gotos dazu gehört, dann ist das so.

Ich kanns ein bisschen verstehen.

Nachtrag:

if (Serial.available() > 0)
    {
    wolf = Serial.read();//1.Wert
//*********
AW1:
   
    wolf = Serial.read();//2.Wert

Es wird geprüft, ob Daten da sind. Wert 1 wird gelesen Wert 2 wird gelesen ohne zu prüfen, ob der Wert da ist.

Das Handbuch sagt:

Returns

the first byte of incoming serial data available (or -1 if no data is available) - int

Und du prüfst nicht auf -1, oder?

Ich schätze mal, damit ist klar warum dein Script versagt.

Ich lerne immer noch und bin über Vorschläge von euch gerne bereit es auch zu ändern

Dann ändere es, installier openHAB und freu dich die Arbeit gespart zu haben.

Hallo Combie,

ich habe nur am Anfang geprüft, ob Daten da sind. Ist eigentlich nur ein mal erforderlich, wenn Daten da sind, bin ich verbunden mit der Heizung und es ist auch nicht mit einer Unterbrechung zu rechnen.

Da ich viel zu wenig davon verstehe, bin ich froh, dass das Script, wenn auch stümperhaft geschrieben, überhaupt funktioniert, jedoch nur mit der Arduino IDE 0023. Das ist ja mein Problem. Ich werde natürlich das Ganze anders strukturieren, wenn ich es verstanden habe, aber keiner zeigt mir einen Weg, oder Beispiel dieses zu ändern, aber ich bekomme gute Ratschläge C++ zu lernen und da ist mir im Augenblick nicht viel mit geholfen.

Gruß Gerd

199 Posts und keine Ahnung von C/C++?? http://playground.arduino.cc/ http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

Den Willen zum Weiterbilden/Lernen muss man schon haben. Wenn du auf einen fertigen Code-Snippet wartest, wird das lange dauern. Des weiteren lernt mans dadurch nie.

Hier und da mal ein goto zu verwenden kann man ja verstehen. Aber wenn das komplette Programm nur aus Spaghetti-Code besteht dann ist das in der Tat fragwürdig. Das wird nicht wegen der Ästhetik abgelehnt, sondern auch weil es schlecht verständlich, schlecht wartbar und eine große Fehlerquelle ist.

Das ist auch nichts C/C++ spezifisches, sondern trifft auch auf viele andere Programmiersprachen zu. Man könnte auch sagen "lerne Programmieren".

COOL: Hallo Combie,

ich habe nur am Anfang geprüft, ob Daten da sind. Ist eigentlich nur ein mal erforderlich, wenn Daten da sind, bin ich verbunden mit der Heizung und es ist auch nicht mit einer Unterbrechung zu rechnen.

Naja... Ich halte diese Annahme für übertrieben optimistisch. Beweise es! (beweise es dir selber, nicht mir)

Meine bescheidene Meinung: Wenn 1 Byte da ist, heißt das nicht, dass das 2te auf dem Fuße folgt. Bei 2400 Baud dauert das schon ein Weilchen bis das 2te reintrudelt.

Kann ja sein, dass das Serial.read() der alten Entwicklungsumgebung blockierend war... Aber das der neueren Umgebung blockiert halt nicht.

Hallo @sschultewolter, tut mir Leid, wenn ich dir da mal so offen sage. [u]Lesen scheint nicht absolut deine Stärke zu sein, Hauptsache du kannst deine unnützen Kommentare loswerden.[/u]

"Den Willen zum Weiterbilden/Lernen muss man schon haben. Wenn du auf einen fertigen Code-Snippet wartest, wird das lange dauern"

Ich habe in meinen Pots zuvor darauf hingewiesen, dass ich bereit bin zum Lernen. Ausserdem erwarte ich überhaupt kein fertiges Script, lediglich ggf eine Hinweis, wie ich mein Script, dass sogar funktioniert, besser gestalten kann.

Bitte verschone mich mit deinen Kommentaren !

Hallo @Serenifly,

auch dir möchte ich ans Herz legen, dich doch aufs Wesentliche zu beschränken. Deine Belehrungen kannst du dir wohl verkneifen [u]"Man könnte auch sagen "lerne Programmieren"[/u].

Wenn ich eine Frage zum Wetter habe, musst du mir nicht sagen, dass ich den Regenschirm vergessen habe. Auch dir kann ich nur sagen: Bitte verschone mich mit deinen Kommentaren !

OK, dann bin ich auch hier aus dem Rennen…

Tipp:
Stelle keine Fragen, wenn du die Antworten nicht hören möchtest.

Hallo @combie,

wirklich nichts gegen dich, du bemühst dich mir zu helfen und sagst mir nicht, dass ich erst einmal lernen sollte, bevor ich hier eine Frage stelle. Du bist einer von ganz wenigen, die auf meine eigentliche Frage eingehen. [u]Ich habe hier in diesem Forum nur überwiegend abwertende Bemerkungen und Ratschläge hinnehmen müssen[/u], dass ich mich schämen muss, überhaupt eine Frage gestellt zu haben. Das ist bitter. [u]Auf Schlaumeier und Platzhirsche kann ich durchaus verzichten[/u], ich wollte lediglich nur eine Frage beantworte haben, kein neues Script, keine Belehrung, was ich vorher hätte machen sollen usw. Bedenkt man mein Alter von fast 70 Jahren, bin ich froh, überhaupt noch ein wenig meine Gedanken zusammen zu halten. Ich glaube, dass ich mir das nicht antuen sollte und ich bin immer davon ausgegangen geholfen zu werden.

Gruß Gerd

Ich kann den Threadersteller einerseits ganz gut verstehen, dass das "Miesmachen" der eigenen Programmierqualität frustrierend ist. Vor allem fühlen sich gleich viele berufen, in die gleiche Kerbe zu schlagen. Fakt ist jedoch, dass es einige Änderungen beim Versionssprung auf Arduino 1.0 gab. Nun ist es am Threadersteller, ob er den ursprünglichen Code den neuen Begebenheiten anpassen möchte. Natürlich kann man in diesem Zuge die goto-Anweisungen eliminieren und ein striktes EVA-Prinzip verfolgen. Dies muss aber freiwillig vom TE kommen, Zurechtweisungen bewirken da das genaue Gegenteil. Die Auswertung der EBus-Daten ist auf jeden Fall recht interessant, bietet doch eure Hilfe an, um daraus ein schönes Community-Projekt zu machen. Im Prinzip wie es auch bei der LED-Blitz-Geschichte vorangetrieben wird. Ist doch eine ähnliche Ausgangssituation: Klare Zielstellung aber für den Initiator selbst (also ohne Hilfe) nicht zu schaffen - im Zusammenspiel mit den anderen Forenteilnehmern entwickelt sich so ein schönes Projekt.