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

Re: hwcom und ASCII Datenverkehr Kategorie: Programmierung (von Newbie - 8.09.2011 8:46)
Als Antwort auf Re: hwcom und ASCII Datenverkehr von André H. - 7.09.2011 20:57
Ich nutze:
C-Control II Station, OSOPT V3.1
Danke André für die prompte Lösung.

Wie immer lag der Teufel im Detail.:-)

Michael

> Hallo Michael,
>
> >
> > else                        //Wenn Link aktiv, sende Statusanfrage
> >     {
> >      s_message="STS";        //Sende Status-Request
> >      hwcom.flush();
> >      hwcom.send(s_message,3)
> >                            
> >      lcdext.zahl2(hwcom.receive(s_response,27,5000)); //Ergibt 27 -> OK!
> >      lcdext.zahl3(strx.comp(s_response,"535-00060955233056232211111")); //Ergibt -1 -> OK
> >      lcdext.zahl2(str.length(s_response)); //Ergibt 0????
>

> Es ist immer wieder dasselbe "Problem".
> hwcom.receive() hat noch nie und wird auch nie "Strings" empfangen, da das noch nie
> so gedacht war. Diese Funktion dient zum Empfang von Daten in ein Byte-Array.
> Ein String ist zwar auch ein Byte-Array, jedoch mit der Besonderheit, daÃ? in Byte 31 die Anzahl
> der Zeichen zu stehen hat. Diese Schreibst Du aber nicht rein.
> Wenn Du mit hwcom.receive()  direkt in einen String empfängst, so bleibt in Byte 31
> natürlich der alte Wert stehen, da der String hier als normales Byte-Array behandelt wird.
> Wie man es macht, kannst Du z.B. anhand von hwcom.input() erkennen.
> Bei Dir wird das aber etwas einfacher:
>
> function recString(s[], byte len, long timeout) returns byte
> {
>  s[31]=hwcom.receive(s, len, timeout);
>  return s[31];
> }

>
>
> >      str.clear(s_substring);
> >      strx.cut(s_response,s_substring,0,3);          //erste 3 Zeichen
> >      V_BatVtg=strx.getNum(s_substring);             //ergibt 0 über hwcom, 535 über b.)
> >      lcdext.zahl4n1(V_BatVtg);
> >      str.clear(s_substring);
> >      strx.cut(s_response,s_substring,0,5);
> >      V_TotBatCur=strx.getNum(s_substring);     //negatives Vorzeichen wird interpretiert
> >  
> > etc.etc.
> >

> Der Rest scheint zu stimmen.
> Besser wäre es bei solchen Dingen natürlich, wenn die Daten nicht als Text übertragen
> würde, sondern direkt als Byte, In oder Long-Werte.
> Das würde das Auswerten einfacher machen.
>
> Aber noch ein paar Anmerkungen zum Zerlegen von Strings:
>
> Mit strx.cut() ist es in Deinem Fall etwas zu aufwendig. In Deinem Fall wären die
> Funktion strx.left() und strx.mid() besser geeignet:
> strx.left(s_response, s_substring, 3);
> Und für alle folgenden Teile mit mid():
> strx.mid(s_response, s_substring, 3, 5);
> �brigens brauchst Du bei keiner der Funktionen den String vorher löschen.
> Die Ziel-Strings werden automatisch überschrieben und der rest mit ASCII 0 aufgefüllt.
>
> Da Dein empfangener String immer ein festes Format hat, würde ich an Deiner Stelle
> eine eigene Funktion mit strx.getNum als Vorlage schreiben.
> Dann brauchst Du die Zwischenschritte mit dem Kopieren der Strings nicht.
>
> MfG André H.


    Antwort schreiben


Antworten: