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 | ||
| ||
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: |