Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, C-Control II Station, OSOPT V3.0
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)