Re: hwcom und ASCII Datenverkehr Kategorie: Programmierung (von André H. - 7.09.2011 20:57) | ||
Als Antwort auf hwcom und ASCII Datenverkehr von Newbie - 7.09.2011 17:20 | ||
| ||
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. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: hwcom und ASCII Datenverkehr (von Newbie - 8.09.2011 8:46) |