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

Re: receive hwcom Kategorie: Programmierung (von André H. - 18.07.2011 11:41)
Als Antwort auf Re: receive hwcom von Wilfried Maier - 18.07.2011 11:06
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.1
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.


Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: receive hwcom (von Wilfried Maier - 18.07.2011 14:56)
    Re: receive hwcom (von André H. - 18.07.2011 19:29)
        Re: receive hwcom (von Wilfried Maier - 19.07.2011 15:59)