Re: hwcom sync-Probleme? Kategorie: Programmierung (von André H. - 5.08.2003 9:59) | |
Als Antwort auf hwcom sync-Probleme? von skontox - 4.08.2003 11:59
| |
Hallo skontox, > Ich habe die CC2 mit einem Datenhandschuh über die RS232-Schnittstelle mit 9600 Baut gekoppelt! > Problem ist, dass der Handschuh seine Daten permanent sendet (kein Empfang möglich!) und ich bei grö�eren > Berechnungen mit den empfangenen Werten Probleme mit der Synkronisation mit dem Empfang habe. > Bei kleineren Berechnungen läuft es ganz gut! Wie oft sendet wird der Datenrahmen pro Sekunde gesendet ? Wie lange dauert das Senden? Gibt es eine Pause zwischen zwei Datenrahmen ? Aus dem Quellcode konnte ich erkennen, da� ein Datenrahmen 10 Byte hat und folgenden Aufbau besitzt: 1.Byte Start-Kennzeichen: Wert 1 Byte 2 bis 9: 8 Datenbytes 10.Byte Ende-Kennzeichen: Wert 128 > Was kann man da machen? Wahrscheinlich ist mein Code auch nicht so super, aber auf die Schnelle > viel mir nix besseres ein. Was soll später, au�er dem Modell-Auto :-) , einmal gesteuert werden ? Das Problem könnte die Rechenzeit werden. Wenn zuviele Daten zu schnell ankommen, hiflt nur, da� Du einen Teil davon auswertest, und den Rest ignorierst.(Puffer regelmä�g mit hwcom.flush() leeren bis die daten wieder ausgewertet werden sollen) Das geht natürlich nur, wenn der Datenhandschuh immer die aktuelle Stellung der Hand sendet, und nicht die Bewegung selbst. Zu hwcom: Es reicht, wenn Du die Schnittstelle am Anfang des Mainthreads einmal initialisierst und die Baudrate setzt. Hier solltest Du auch einmal mit hwcom.flush() den Empfangspuffer leeren, wenn bereits vor dem System-Start der CC2 Daten empfangen werden. Deine Hauptschleife kann man folgenderma�en optimieren: ... byte errcnt; run 255;// Maximale Prio, nur bei Single-Thread Anwendungen empfohlen ! hwcom.flush(); errcnt=0; loop { wait hwcom.rxd(); if hwcom.get()==1 //Endzeichen im Paket { wait hwcom.rxd(); if hwcom.get()==128 //Startzeichen im Paket { errcnt=0; wait hwcom.rxd();hwcom.get(); //Byte 1 ignorieren wait hwcom.rxd();hwcom.get(); //Byte 2 ignorieren wait hwcom.rxd();hwcom.get(); //Byte 3 ignorieren wait hwcom.rxd();hwcom.get(); //Byte 4 ignorieren wait hwcom.rxd();hwcom.get(); //Byte 5 ignorieren wait hwcom.rxd(); //Byte 6 wert= hwcom.get();//Enthält den "Pitch"-Wert Wert 255 ganz nach vorne gekippt! //Wert 0 ganz nach hinten. 127 genau die Waage if wert>=130 and wert<=155 //Der Wagen soll nicht fahren! { ports.set(0,0); //Vorwärts ist aus ports.set(1,0); //Rückwärts ist aus } else if wert<130 //Der Wagen soll Rückwärts fahren { ports.set(0,0); //Vorwärts ist aus ports.set(1,1); //Rückwärts ist an } else if wert>155 //Der Wagen soll Vorwärts fahren { ports.set(1,0); //Rückwärts ist aus ports.set(0,1); //Vorwärts ist an } wait hwcom.rxd(); //Byte 7 wert= hwcom.get();//Enthält den "Roll"-Wert Wert 255 ganz nach vorne gekippt! //Wert 0 ganz nach hinten. 127 genau die Waage if wert>=100 and wert<=155 //Der Wagen soll nicht lenken! { ports.set(2,0); //Rechts ist aus ports.set(3,0); //Links ist aus } else if wert<100 { ports.set(2,0); //Rechts ist aus ports.set(3,1); //Links ist an } else if wert>155 { ports.set(3,0); //Links ist aus ports.set(2,1); //Rechts ist an } wait hwcom.rxd();hwcom.get(); //Byte 8 ignorieren } else { errcnt=errcnt+1; if errcnt>=20 break; // Schleife verlassen => keine sync möglich } } else { errcnt=errcnt+1; if errcnt>=20 break; // Schleife verlassen => keine sync möglich } } resume; ... Ich habe hier die For-Schleife und die damit zusammenhängenden If-Abfragen weggelassen, da diese zu viel Zeit in Anspruch nehmen. Dafür wird öfters mit hwcom.get() gerabeitet. Die Syncronisation habe ich auch angepasst. Selbst, wenn diese einmal verlorengehen sollte, sollte der Datenrahmen wieder erkannt werden. Dazu werden bis zu 20 Byte ausgewertet, um den Beginn eines Datenrahmen zu finden. Wird dieser nicht gefunden, so wird die Schleife verlassen. Wenn Du mit Multithreading arbeitest, solltest du die Prio des Loops etwas herabsetzen. (statt run 255 z.B. run 128) Du kannst die Eingelesenen Werte auch Global verfügbar machen, indem Du statt auf diese zu reagieren, erstmal in ein Byte-Array schreibst, und dann mit einem anderem Thread mit den Daten entsprechend "reagierst". Hier könnte man zwar wieder mit einer For-Schleife arbeiten, jedoch sollten die extra-Programmzeilen vorgezogen werden, um sich die Rechenzeit der For-Schleife selbst zu sparen: Mit For-Schleife: for i=0 ... 7 {wait hwcom.rxd;Data[i]=hwcom.get();} Ohne For-Schleife: wait hwcom.rxd(); Data[0]=hwcom.get(); wait hwcom.rxd(); Data[1]=hwcom.get(); wait hwcom.rxd(); Data[2]=hwcom.get(); wait hwcom.rxd(); Data[3]=hwcom.get(); wait hwcom.rxd(); Data[4]=hwcom.get(); wait hwcom.rxd(); Data[5]=hwcom.get(); wait hwcom.rxd(); Data[6]=hwcom.get(); wait hwcom.rxd(); Data[7]=hwcom.get(); Ich hoffe, das hilft Dir weiter. Probiere die abgeänderte Schleife einmal aus und schreib, ob's funzt. :-) 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 sync-Probleme? (von Fischi - 5.08.2003 13:40) |