Schmarrn ?? So nicht! Kategorie: Programmierung (von thomas - 7.04.2004 22:59) | ||
Als Antwort auf So ein Schmarrn ! von André H. - 4.04.2004 11:28 | ||
| ||
Hallo, erst einmal eines vorweg: Die hwcom-Routinen sind in Ordnung. Trotzdem gibt es weiterhin das beschriebene Problem, dass nur durch das generelle Verwenden von Variablen zur Ausgabe von Daten über die hwcom-Schnittstelle vermieden werden kann. Allerdings würde das Verwenden von Konstanten z.B. bei einer Menuführung einige Vorteile bringen. Aber was ist denn nun eigentlich das Problem? Wie "zwischen den Zeilen" aus Andre's Antwort zu ersehen ist, wei� er die Antwort, teilt sie uns aber leider nicht mit. Die von ihm gegebene Begründung ist so nicht richtig!! Ich versuche das Ganze aufzuklären (am Ende des Textes). > Hallo Thomas, > > > Wenn ich kurz hintereinander einzelne Strings sende, dann kommt am anderen Ende > > nur "MIST" an! > > > > Also, wenn ich z.B. folgendes schreibe: > > > > hwcom.print("Hallo "); > > hwcom.print("Du "); > > hwcom.print("Da!"); > > hwcom.ret(); > > > > > > dann kommt am anderen Ende nur folgendes an: > > "HaDa!Da!" > > Dies ist abhängig von der eingestellten �bertragungsrate und dem Zufall. > > Im Modul hwcom.c2 sind diesbezüglich keinerlei Fehler ! > Wenn Du mit hwcom Festtexte ausgibst, mu�t Du warten, bis > der vorherige String gesendet wurde. Denn, wie hei�t es schon so schön > deutlich im Handbuch zur CC2: Das Senden von Datenrahmen (=Byterrays=Strings) > geschieht im Hintergrund (=eigener Systemthread). Und hier steckt die erste Unsauberkeit: Eigentlich dürften Festtexte kein Problem mit einer Verarbeitung im Hintergrund haben, da sie bereits bei der Programmerzeugung während der Kompilierung erzeugt werden und nicht mehr verändert werden. Somit dürfte das nur für Variablen gelten! Bei jeder normalen Programmiersprache wäre das auch so, nicht bei der Programmiersprache der C-Control II. > > > Eigentlich dürfte dies nicht passieren, da in den Routinen im Modul "hwcom" > > wait-Aufrufe vorhanden sind. Allerdings werden diese anscheinend nicht ausgeführt!! > > Natürlich werden diese ausgeführt. > Du überschreibst nur mit jedem neuem print() die zu sendende Variable, > bevor sie gesendet wurde. Hier ist die nächste Unsauberkeit: Welche Variable denn? In meinem Beispiel wird nicht eine einzige Variable verwendet; nur Konstanten! Dies zeigt allerdings auch, dass Andre den Hintergrund, warum es nicht funktioniert, kennt. Das von Andre gegebene Beispiel ist richtig und funktioniert wie erwartet: > > Wenn su beispielsweise so schreibst, gibt es keine Probleme: > string s1,s2; > ... > s1="Hallo "; > hwcom.print(s1); > s2="Du "; > hwcom.print(s2); > hwcom.print("Da!"); > hwcom.ret(); > > Kurz, wenn Du abwechselnd zwei Variablen benutzt, gibt's keine Probleme. > Au�erdem ist diese Art des Sendens von Datenrahmen/Strings am schnellsten. > > Natürlich hätte ich in hwcom.print() eine ready()-Abfrage am Ende der print()-Funktion > einbauen können. Dann würde aber der zugreifende Thread unnötig ausgebremst, > wenn dieder nich nur senden mu�, sondern auch noch andere Aufgaben erfüllt. > (z.B. Aufbereiten von zu sendenden Daten vor dem Senden etc.) > Ansonsten dürfte man nurnoch hwcom.print2() für das senden von Stringvariablen verwenden. > > Sorry, aber langsam bin ich das Thema hwcom etwas leid, da dazu schon so viel geschrieben > wurde, und die Suchfunktion mittlerweile sicher genug Antworten dazu liefert !! > > MfG André H. > Nun zur Beschreibung des Problems. Der folgende Programmcode hat das gleiche Problem, das ich in meinem ersten Beitrag beschrieben habe: const HINWEIS = "HEX-Ziffern" const HEX = "0123456789ABCDEF" int i,len; hwcom.print(HINWEIS); // Ausgabe der Hinweistextekonstanten len = str.length(HEX); // Textlänge ermitteln for i = 0..len-1 { ... } Was man hier wohl nicht erwarten würde: auf der seriellen Schnittstelle wird nicht die Konstante HINWEIS sondern die Konstante HEX ausgegeben! Strings werden immer als Referenz an Funktionen übergeben. Diese werden immer im Segment 8 erwartet. Die Konstanten liegen allerdings im Programmcode und der liegt nicht in diesem Segment. Also kann die Konstante eigentlich nicht an die Funktion übergeben werden. Der Kompiler behilft sich, in dem er einfach eine Variable erzeugt, den Inhalt der Konstanten hineinkopiert und an die Funktion über- gibt. Dies macht er allerdings nicht nur beim Aufruf der hwcom.print()-Funktion sondern auch beim Aufruf der str.length()-Funktion. Und so wird der Inhalt der (unsichtbaren) "Variablen" die der print-Funktion übergeben wurde in der nächsten Zeile beim Aufruf der length-Funktion wieder überschrieben. mfg Thomas | ||
Antwort schreiben Antworten: Re: Schmarrn ?? So schon! (von André H. - 11.04.2004 9:51) Re: Schmarrn, jetzt wird's lustig (von thomas - 12.04.2004 21:03) Re: Schmarrn, jetzt wird's lustig (von Dietmar Weickert - 13.04.2004 11:10) hwcom-Modul nicht fehlerhaft (von thomas - 13.04.2004 22:26) |