Re: mem.copy was mache ich falsch? Kategorie: Programmierung (von André H. - 3.08.2007 10:47) | ||
Als Antwort auf mem.copy was mache ich falsch? von MaWo - 22.07.2007 20:35 | ||
| ||
Hallo MaWo, Das ist mal wieder ein typischer Fall von nicht geladenem sys0002.hex. Warum liest eigentlich keiner mehr die Hilfe-HTML zu den Modulen oder wenigstens die Modulheader, was dort unter "requires" bzw. "Benötigt" steht? Auch verstehe ich nicht, warum Du in Deinem Programm drei Threads benutzt. Das verursacht in diesem Fall eher Probleme, als da� es einen Nutzen ergibt. Denn, da Du aus mehreren Threads "ungeschützt" auf gleiche Ressourcen zugreifst, kann es zu einem "Datendurcheinander" kommen. Besondern Dein Init Thread sollte eine Funktion sein, und kein Thread. Denn sobald noch mehr Initialisierungen dort reinkommen, wird es zu einem Threadwechsel kommen, bevor der Thread einmal durchlaufen ist. D.h. das restliche Programm arbeitet bereits, bevor alle Initialisierungen durch sind. Also mache daraus bitte eine Funktion. Dein Thread "Auswertung" sollte auch als Funktion ausgeführt werden. Ein Auslagern in einen extra Thread bringt hier keinerlei Vorteil. Es hat eher den Nachteil, da� es während des Auswertens ein Threadwechsel erfolgen kann, und bereits neue Daten eingelesen werden können, bevor fertig ausgewertet wurde. Ach ja, noch ein Hinweis: Definiere Bytearrays bitte immer mit einer geradzahligen Anzahl an Elementen. Also statt byte sData[255] lieber sData[256]. MfG André H. > Hallo, > > ich versuche mich gerade an eine Komunikationsroutine. > Hier sollen die 1. beiden empfangenen Byte des Array in das > Sendearray copiert werden - aber irgendwie klappt es nicht. > Hier mein Progamm: > > byte rData[200] , sData[255], cAdr, Func ; > int Adr , Anz , lenData , CRC , cData ; > int lop, ret ; > > thread init // Schnittstelle initialisieren und Geschwindigkeit einstellen > { > hwcom.init(); // serielle Schnittstelle initialisieren > // Geschwindigkeits Variable setzen > // 300=0; 600=1; 1200=2; 2400=3; 4800=4; > // 9600=5;19200=6;38400=7;57600=8;115200=9 > hwcom.setspeed (6); // serielle Geschwindigkeit einstellen > hwcom.setbuf(rData,200);//Emfangspuffer setzen > halt;} > > function request() returns int //Auf Request warten und Daten holen > {ret=hwcom.rxd(); // Warten auf Anfrage von Daten > if ret > {hwcom.receive(rData,8,100); // Daten puffern > return ret; // bei Daten Ok zurückgeben > } > else > {return ret;} // Keine Daten zurückgeben > } > > thread Auswertung // Empfangene Daten auswerten > { > hwcom.send(rData,8); // Empfangene Daten senden > cAdr=rData[0]; // Com Adresse extrahieren > Func=rData[1]; // Funktion extrahieren > Adr=mem.getint(rData,2); // Adresse extrahieren > Anz=mem.getint(rData,4)*2; /* Anzahl Datenwörter(int) extrahieren > und Anzahl Byte berechnen(x2) */ > mem.putint(sData,1,Anz); // Datenbyte länge setzen > sData[0]=rData[0]; // Datenbyte Adresse setzen > sData[1]=rData[1]; // Datenbyte Funktion setzen > hwcom.send(sData,8); // Daten senden > halt;} > > thread main // Coordination Ausführen > { > run init; // Schnittstelle Initialisieren > loop // Schleife für kontinuierliche Datenabfrage > {hwcom.flush(); // Empfangspuffer leeren > wait request(); // Auf Anfrage warten > run Auswertung; // request Auswerten und Daten Senden > } > } > > Ich sende 1,3,0,0,0,0,20,197,205 > Wenn ich statt den 2 Zeilen > > sData[0]=rData[0] > sData[1]=rData[1] > > mem.copy(sData,0,rData,2) > > verwende bekomme ich als Antwort: 0,0,20,0,.... > bei dem 2 Zeiler ist die Antwort richtig 1,3,20,0,.... > > was mache ich falsch oder habe ich etwas übersehen? > Ich denke mit der Copy Variante bin ich etwas schneller > in der Ausführung des Programms. > > Mfg > MaWo > > Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: mem.copy was mache ich falsch? (von MaWo - 14.08.2007 21:13) Re: mem.copy was mache ich falsch? (von André H. - 21.08.2007 9:16) |