Re: I2CCOM 64Byte FIFO Lesefehler ??? Kategorie: I²C-Bus (von FF - 13.02.2006 10:08) | |
Als Antwort auf Re: I2CCOM 64Byte FIFO Lesefehler ??? von André H. - 10.02.2006 20:56
| |
> Hallo FF, (<- guter Name ;-) ) > > > > ich möchte mit der CC2-Station Daten aus einer Wetterstation (Elsner P02-RS465) verarbeiten. > > Die Wetterstation ist an einen Wandler RS485 nach RS232 angeschaltet. > > Wenn ich nun den bisherigen Aufbau an eine COM-Schnittstelle eines PC's anschliesse und > > 19200baud 8N1 einstelle, kann ich auf dem Monitor (mittels Programm, das den Eingang an COMx > > auf den Bildschirm zaubert) jede Sekunde einen neuen 40Byte langen Ausdruck sehen. > > Schliesse ich das ganze an die I2CCOM an, gelingt es mir nur 16Byte unterschiedliche Bytes > > zu empfangen, bevor wieder mit dem Inhalt des ersten Byte begonnen wird. > > > > Bei der I2CCOM habe ich den TL16C550C gegen TL16C750 ausgetauscht. > > => initCOM(1,0,1) > > > > Ich kann mit get() das Endzeichen 0x03 des 40Byte langen Protokolls separieren. > > Danach setze ich ein flush() um den Empfangspuffer zu leeren für den nächsten Datensatz. > > Danach ist es egal, ob ich receive(DATA[]) mit DATA[40] verwende oder über eine > > Schleife die 40 Zeichen versuche einzeln mit get(DATA[i]) einzulesen. > > Ich erhalte nur 16 von den 40 Zeichen. > > > > Hat jemand eine Idee, wo das Problem liegen könnte oder einen Lösungsvorschlag ??? > > Poste am besten einmal kurz Deine Routinen. > Denn, der 64Byte-Fifo ist von mir natürlich gestestet und funktioniert ohne Probleme. > Darum vermute ich, da� es irgendeine Kleinigkeit an den Routinen ist. > (z.B. versehentliches Zurücksetzen des 64Byte-FiFo-Modes etc.) > > Du kannst das Bit auch mit i2ccom.getReg(comport,i2ccom.IIR) wieder auslesen. > Beim Rückgabewert mu� dann Bit 5 gesetzt sein. > > MfG André H. > Hallo zurück und vielen DANK für den Tipp, ich muss meine Aussage z.T. revidieren. Es können tatsächlich mehr als 16 Byte von der I2CCOM gelesen werden. Aber nach 28 bzw. 29 Zeichen (Byte) gibt es eine �berlagerung, so dass die Zeichen 29-40 eine Wiederholung der Zeichen 1-12 darstellen. Dies ist unabhängig davon, welche Methode ich zur Selektion des Anfangs zum Lesen wähle. Im folgenden Beispiel triggere ich das Einlesen des 40Byte-Arrays der Wetterstation,in dem ich den Puffer der I2CCOM so lange leere, bis eine Sendepause der Wetterstation erreicht ist. Dann wird versucht, über i2ccom.receive() das nächste 40Byte Array einzulesen. Als zusätzlicher Effekt ist noch zu nennen, dass bei dem Beispielcode die Anzahl der eingelesenen Byte's zwischen 16 und 40 pro funktionsdurchlauf differiert. Hier der Beispielcode mit Initialisierung, Einlesen und Ausgabe am LCD-Displ. der Station II: //-----------------I2CCOM initialisieren und einstellen ----------------------// function i2ccom_init() returns int { int i2ccom_erkannt; i2ccom_erkannt=0; // = nicht erkannt i2ccom.setDataPCF(7); //I2C-Adresse 7 i2ccom.defineCOM(1,6,0); //Com1,I2C-Adresse Ctrl 6, Sub-Adre. 0 i2ccom_erkannt=i2ccom.initCOM(1,0,1);//Com1,Autoflow = aus 0/ 64Byte-Puffer = 1 i2ccom.setFormat(1,i2ccom.set8N1); //Com1,Datenformat 8 Daten no par. 1 Stopp i2ccom.setspeed(1,6); //Com1, 19200 Baud return i2ccom_erkannt; } //-----------------Wetterdaten von I2CCOM COM1 lesen -------------------------// function get_wetter() returns int { int anzahl_daten; byte I, J,DATA[40], s1[16], s2[16], s3[8]; //s1, s2, s3 für lcd-Ausgabe for I=0...39 { DATA[I]=35; //Belegung alle Felder DATA mit '#' if I<16 { s1[I]=36; //Belegung Ausgabestrings S1-S3 mit '$' s2[I]=36; if I<8 s3[I]=36; } } i2ccom.flush(1);//leeren des Eingangspuffers der I2CCOM COM1 anzahl_daten = 0; while i2ccom.rxd(1); //den Puffer so lange leeren, bis keine Daten { // mehr gesendet werden (beginn Sendepause) i2ccom.flush(1); sleep 10; } //0x57= 1.Zeichen des Protokolls der Wetterstation //0x03 = Endekenneung des 40Byte langen Datensatzes der Wetterstation anzahl_daten=i2ccom.receive(1,DATA,40, 999); //es wird 1x pro Sekunde gesendet for J=0...16 { s1[J]=DATA[J]; //Gelesene Daten in Ausgabestring s1-s3 übertragen s2[J]=DATA[J+16]; if J<8 s3[J]=DATA[J+32]; } lcdext.clear(); lcdext.line(1); lcdext.printlength(s1,16); lcdext.line(2); lcdext.printlength(s2,16); sleep 3000; lcdext.clear(); lcdext.line(1); lcdext.printlength(s3,8); sleep 2000; lcdext.clear(); lcdext.print("anz_daten="); lcdext.zahl3p(anzahl_daten); sleep 1500; if anzahl_daten < 40 return 0; else return -1; } //-----------------Hauptprogramm -------------------------// thread main { int status_i2ccom_init, status_get_wetter; lcdext.init(); pcf.init(); stports.init(); lcdext.clear(); status_i2ccom_init = i2ccom_init(); if status_i2ccom_init { while get_wetter(); lcdext.clear(); lcdext.print("kein Wetter "); sleep 3000; } else lcdext.print("keine I2CCOM "); sleep 3000; } Habe ich da irgend einen Denkfehler beim Einlesen oder Ausgeben drin ??? Gruss FF | |
Antwort schreiben Antworten: Re: I2CCOM 64Byte FIFO Lesefehler ??? (von FF - 15.02.2006 6:49) Re: I2CCOM 64Byte FIFO Lesefehler ??? (von FF - 17.02.2006 13:46) Re: I2CCOM 64Byte FIFO Lesefehler ??? (von FF - 22.02.2006 7:35) Re: I2CCOM 64Byte FIFO Lesefehler ??? (von FF - 23.02.2006 6:32) |