Re: hwcom sync auf Datenrahmen Kategorie: Programmierung (von Newbie - 16.09.2011 16:26) | ||
Als Antwort auf Re: hwcom sync auf Datenrahmen von Newbie - 16.09.2011 15:32 | ||
| ||
Ein Fehler habe ich gefunden - offenbar hatte ich einen Tread noch main benannt, den ich nicht starten wollte. Auf HWCOM funktioniert alles perfekt. Synchronisation sofort.. ECHO identisch aaaaber.... Wenn ich nun in der Prozedur auf HWCOM mit SWCOM ersetze (benutze den Pegelumsetzer) dann passieren verrückte Sachen: Als Echo erhalte ich 18 Zeichen zurück, obwohl ich nur 9 schicke! Beide Schnittstellen sind gleich initialisiert, haben einen eigenen FIFO mit 100 Byte (FIFO1 und FIFO2) SWCOM wird nur hier benutzt, also alle Konkurrenzierenden Zugriffe ausgeschlossen. Gibt es da einen Unterschied den ich nicht beachte zwischen SWCOM und HWCOM? > Ignorieren bitte :-) > > Der Fehler war mal wieder perfide. Ich hatte nicht in allen Modulen main umbenannt. Da half es auch > nicht, den run-Befehl im Hauptprogramm auszukommentieren - der zweite Thread startete trotzdem. > > Deshalb der "Salat". > > Funktioniert alles Tip-top. > > > > > �ber die serielle Schnittstelle will ich regelmässige Datenrahmen empfangen. Bisher hat das ganz gut > > geklappt, wenn ich dies im Stile Anfrage -> Antwort gemacht habe. > > Ein anderes Gerät sendet regelmässig (ca. 1x pro Sekunde) einen Datenrahmen. In meinem Fall 9 Byte. > > > > Ich muss nun darauf synchronisieren und dann auswerten - aber irgendwie sehe ich den Wald vor lauter > > Bäumen nicht.. > > > > > > thread COM > > { > > byte buffer[32]; //2ter serieller Buffer > > byte length; > > int Wert1; > > int Wert2; > > int Wert3; > > byte Flag1; > > byte Flag2; > > byte Flag3; > > > > long timer; > > > > mem.fill(buffer,32,0x00); //Löschen > > > > loop > > { > > > > wait hwcom.ready(); > > > > length=hwcom.receive(buffer,9,500); //Kürzerer Horizont als der Sendetakt!! > > lcdext.clear();lcdext.zahl(length); //Debug Info > > if length!=9 //Wenn unkorrekte Anzahl - unsynchronisiert > > { > > mem.fill(buffer,9,0x00); > > hwcom.flush(); //Buffer verwerfen > > wait hwcom.rxd(); //Warten auf nächsten Rahmen > > continue; > > } //direkt weiter > > else > > { > > > > Wert1=mem.getint(buffer,0); > > Wert2=mem.getint(buffer,2); > > Wert3=mem.getint(buffer,4); > > Flag1=buffer[6]; > > Flag2=buffer[7]; > > Flag3=buffer[8]; > > > > wait hwcom.ready(); > > hwcom.send(buffer,9); //Echo > > > > > > } > > > > } > > > > > > > > Nun habe ich dies mit einem Terminal-Programm getestet - wie die anderen Funktionen auch. > > > > Aber es will einfach nicht klappen! Ich sende über ein Terminal folgendes im 1 Sekunden Takt (zum Testen): > > > > x01xF4x00xF0x01x2Cx01x01x01 > > > > also 9 Byte. Eigentlich hätte ich gedacht, das ich spätestens beim 2ten Senden synchronisiert bin. > > > > Aber weit gefehlt. Klappt gar nicht. Auf dem Display wird angezeigt, das weniger Bytes empfangen wurden. > > > > Aber bei 9600Baud sollten doch 9 Byte wirklich viel Schneller übertragen werden als der Timeout? > > > > Wer hat sowas schon mal gemacht? Bessere Ansätze sind gern gesehen.. | ||
Antwort schreiben Antworten: |