Re: receive hwcom Kategorie: Programmierung (von Wilfried Maier - 18.07.2011 14:56) | |
Als Antwort auf Re: receive hwcom von André H. - 18.07.2011 11:41
| |
> Hallo Wilfried, > > > Ich habe die Reihenfolge umgestellt, doch der Funktionsaufruf bleibt nachwievor beim hwcom.receive trotz Timeout=300 stecken. > > Bin derzeit ziemlich ratlos. > > Woher wei�t Du, da� das Programm bei hwcom.receive() hängen bleibt? > Du hast keinerlei Debuggingausgaben. > Denn so, wie Du Dein Programm geschrieben hast, wird es nie zu irgendeiner Ausgabe kommen. > > Ich mache mal ein paar Anmerkungen in Deinem Programm: > thread main > { > int x,anz; > byte s[32]; //<-- hier definierst Du ein Bytearray, keinen String > > hwcom.init(); // der Init ist hier unnötig, hwcom wird nach einem Reset automatisch vom OS initialisiert > hwcom.setspeed(hwcom.SPEED_57600); > > loop > { > wait hwcom.rxd(); //<-- Du wartest hier bis mind. ein Zeichen empfangen wird. > anz = hwcom.inbuffercnt(); //<-- hier wird selten etwas anderes au�er 1 drinstehen, selten mal eine 2 > hwcom.print("Anzahl : "); hwcom.num(anz); hwcom.ret(); > > // Daten empfangen > x = hwcom.receive(s,anz,300); //<-- Warum ein Timeout? Die Zeichen sind schon im Puffer > // und Du empfängst nur max. so viele, wie nach der Abfrage im Puffer sind. > hwcom.print2(s); //<-- Das kann nicht funktionieren. Prinfunktionen geben immer einen Strin aus. > // Du übergibst aber ein reines Array ohne Stringinformationen. Da in s[31] nichts geschrieben wurde. > hwcom.flush(); > } > } > > So gesehen, macht Dein Programm genau das, was Du geschrieben hast. > Und zwar: nie eine Ausgabe, au�er es steht in s[31] ein anderer Wert als 0. > Wenn Du den Inhalt eines reinen Bytearrays senden willst, mu� Du hwcom.send() verwenden. > In Deinem Fall: > hwcom.send(s, x); > > Aber: Du wirst nie mehr als ein bis zwei Zeichen gleichzeitig empfangen, da Du direkt nach > dem Warten auf ein empfangenes Byte, Die Anzahl der Bytes im Puffer ausliest, und damit > die zu empfangenen Zeichen festlegst. > Besser ist es, wenn Du einfach eine feste max. Länge vorgibst. > z.B.: > x = hwcom.receive(s,30,300); > Nur so werden bis zu 30 Zeichen empfangen, sofern nicht zwischen zwei Zeichen eine Pause > grö�er 300ms eintritt. Ansonsten eben weniger. > Und wenn Du Dein Bytearray als String verwenden willst, mu� Du in s[31] die Anzahl > der Zeichen schreiben. z.B. so: > s[31] = hwcom.receive(s,30,300); > Dann kannst Du hwcom.print2() verwenden. > > MfG André H. > > PS: Benutze beim Posten von Quelltext bitte die Code-Tags. Hallo André, Danke für die ausführliche Beschreibung. Ich habe Deine Vorgaben umgesetzt, jedoch ohne Erfolg. Nun habe ich den Thread auf Minimalanforderung beim receive wie folgt begrenzt. thread main { int x; byte s[32]; hwcom.setspeed(hwcom.SPEED_57600); loop { wait hwcom.rxd(); x = hwcom.receive(s,1,300); hwcom.send(s,x); } } Es erfolgt jedoch keine Ausgabe. Wenn ich nun statt dem receive ein get verwende, und die Zeichen einzeln ausgebe, wird genau das zurück gesendet, was vor empfangen wurde. Dabei ist kein Unterschied ob ich die Bytes einzeln oder in einen ganzen Paket aufeinmal zur CC2 sende. Ich wei� daher immer noch nicht, wo mein Denkfehler liegt. MfG Wilfried thread main { byte c; hwcom.setspeed(hwcom.SPEED_57600); loop { wait hwcom.rxd(); c = hwcom.get(); hwcom.put(c); } } | |
Antwort schreiben Antworten: Re: receive hwcom (von André H. - 18.07.2011 19:29) Re: receive hwcom (von Wilfried Maier - 19.07.2011 15:59) |