![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo Forum - Freunde, im Forum hier wurde vor langer Zeit einmal das Einlesen von GPS Daten kurz behandelt siehe (http://ccintern.dharlos.de/forum/lesen.php?eintrag=8925 Problem serielle Datenübertragung Kategorie: C-Control I V1.2/2.0 (von Stefan Süßmann - 28.11.2005 20:43)//Stefan Süßmann nutzt: CC1-M-Unit V1.2/2.0, Micro) Auf dieses Beispielprogramm konnte ich dann aufsetzen und es auf meine Anwendung anpassen. Für den Datentransfer über die Funkstrecke eines 2.4/5.6GHz A/V Sende-/Empfängers habe ich dazu ein HW-Modem für 9600bps entwickelt. Das Programm Listing ist unten angehängt. Vielleicht hilft dieser update zum GPS Daten einlesen einigen Nutzern dieses Forums. In meiner Anwendung sendet das GPS Modul mit 38400bps im Zeitabstand von 0,1sec je ca. 270 Bytes innerhalb 0,03 sec an den ESCI_RS232 Eingang der OMACRO. Die OMACRO sendet dann über den Semiwire-RS232 nur noch ca. 30 Bytes/0,1sec (Längen-, Breitengrad und Höhe). Im Programm habe ich noch erläutert, welche Probleme ich hatte, wenn ich das WIN 3.1 Programm terminal.exe benutzt hatte. Mit dem Hyperterminal Programm hatte es dann ohne Probleme funktioniert. Auch bei direkt empfangenen GPS Daten (alles auf der Terrasse im Freien aufgebaut) hat es auf anhieb funktioniert. Dabei war beeindruckend die hohe Verarbeitungsgeschwindigkeit der OMACRO. Viel Spass am Programm wünscht Joe ########## program listing ########################### ' 2_GPS_EI.BAS vom Mi 19.11.2014 Josef Fenk; Einlesen von $GPGGA NEMEA GPS Daten ' Umfang: 478 Basic Bytes; 0 Sys-Bytes; 26 RAM-Bytes=0: ' Hardware: ' Serielle Schnittstelle an Port 1;GPS-sortierte Datenausgabe mit PRINT an Audiomodem ' Hardwaremaessig implementierten 2_RS232 Schnittstelle (ESCI) zum ' GPS-Daten einlesen an RXD:Pin7/Port13; nicht benutzt ist TXD:Pin6/Port14 ' Hinweis zur Benutzung der hardwaremaessig implementierten 2. Seriellen Schnittstelle (Esci) ' der Empfangsbuffer dieser 2. ser. Schnittstelle hat 8Byte ' nach 8 Byte erfolgt ueberlauf und Wert EsciErr =-1 ' Aufbau: GPS_Modul==>ESCI_RS232==>Daten einlesen in O-MACRO mit 38400Baud==> ' ==>mit O-Macro GPS Daten reduzieren und ==>ueber Semiwire RS232 mit 9600bps==> senden an ' ==>Audio-Modem-Modulator==>dann Audio-modulierten Datenstream senden an ==> ' ==> Audioeingang von 2.4/5.6GHz Sender ==> 2.4/5.6GHz Funksignal senden an==> ' ==> Bodenstation ==> dort Demodulation des Tonsignals ==> daten in Daten einlesen in O-MACRO mit 9600bps ' ==> Daten verarbeiten und Antennentracking Servos Horizontal bzw. vertikel damit ansteuern ' ==> sowie weitere Daten wie z.B. RSSI und Akkuspannungen ausgeben auf LCD Display ' Software: ' GPS Dateneinlesen mit 38400 Baud von GPS Modem ' GPS-Datenauswertung daraus und reduzierte Daten senden ueber Semiwire RS232 mit 9600 Baud ' ESCI- Schnittstelle: hier 38400 Baud benutzt ' bez. Baudrate: 300, 600, 1200, 2400, 4800,9600,19200, 38400 verfuegbar ' bez. ESCI_Sch.: hat 8 Byte Empfangsbuffer; GET holt Zeichen vom Empfangsbuffer und nicht direkt vom Eingang ab ' mit n*mal GET wird GPS NMEA Zeichenketten eingelesen, ' solange man nicht zuviele zusaetzliche Befehle zwischen folgenden GET Befehlen einfuegt ' ' --- Betriebssystem konfigurieren ------------------------------------------ INCLUDE "OMAC.DEF" 'Include-Datei mit Definitionen vom April 2010 ' --- Definitionen Variable fuer das Hauptprogramm ' ----Def. WORD Variable ------------------------------------------ DEFINE Bg_sek WORD 'einerstelle bzw. endwert Breitengrad-sekunde Rechenwert 0 bis 999 moeglich DEFINE Lg_sek WORD 'Laengengrad Rechenwert 0 bis 999 moeglich DEFINE GPS_hoe WORD 'Rechenwert my standort 400 bis 9999 m moeglich ' ----Def. Byte Variable ------------------------------------------ DEFINE Bggg_10er BYTE ' zehnerstelle DEFINE Bggg BYTE ' einerstelle bzw. endwert 2-stellig;Breitengrad 0 bis 90 Grad DEFINE Bg_mi10er BYTE DEFINE Bg_mi BYTE 'einerstelle bzw. endwert 2stellig 0 bis 60 Grad DEFINE Bgse_1000er BYTE DEFINE Bgse_100er BYTE DEFINE Bgse_10er BYTE DEFINE Lg_100er BYTE DEFINE Lg_10er BYTE DEFINE Lggg BYTE 'einerstelle bzw endwert 3-stellig; Laengengrad Hunderter 0 bis 180 Grad DEFINE Lg_mi10er BYTE 'zehner stelle DEFINE Lg_mi BYTE ' einerstelle bzw. endwert 2-stellig o bis 60 DEFINE Lgse_1000er BYTE DEFINE Lgse_100er BYTE DEFINE Lgse_10er BYTE DEFINE hoe1000er BYTE DEFINE hoe100er BYTE DEFINE hoe10er BYTE DEFINE Zeichen BYTE DEFINE i_zae BYTE '***Definition der Bit Variablen von Byte 01 u. 02; Bit 1 bis 8 'DEFINE Flag1 BIT[01] ' Ausstieg bei Unter/Ueber Spannung bei Entl/Ladung '***** Definition der Konstanten 'DEFINE Absch 158 ' Abschaltschwelle der Zellspannung bei ca. 3,10V '******** Definition der A/D Wandler Eingabe -Ports **** '***** Definition der Digitalen Ein- / Ausgabeports 'DEFINE RS232_1 PORT[01] ' Serielle Schnittstelle_1 fuer Onboard Programmierung und Datenausgabe 'BAUD R9600 'DEFINE Taste PORT[04] 'Warte-Taste '***** Portwiderstaende = 26kOhm s.S. 63 Manual; abschalten um ADC Fehler zu reduzieren '***** Pullup Widerstaende werden abgeschaltet, damit AD Messung genauer ist 'PULLUPA = &b00001101 '* AD2, 5, 6 jeweils Pullup-R abgeschaltet; Eingangsport zusaetzlich mit 47nF abblocken 'PULLUPB = &b11000011 '* AD11, 12, 13, 14 jeweils Pullup-R abgeschaltet ' '************************************ ' hier wird nur 8Bit AD Wandlung genutzt ' Bits im ADC10 Clock Register (ADCLK): ' ADLPC ADIV1 ADIV0 ADICLK MODE1 MODE0 ADLSMP ACLKEN 'ADCLK=ADCLK AND &b11110011 OR &b0100 'MODE1 loeschen, MODE0 setzen 'ADCLK=&b00110110 ' aktiviert 10bit Wandlung max. Wert 1024=5000mV '--- Das Hauptprogramm ----------------------------------------------------- PRINT "Start_GPS" #Start GOSUB GPS_Einl ' PRINT "Bggg_10er=";Bggg_10er,"Bggg=";Bggg,"Bg_mi10er=";Bg_mi10er,"Bg_mi=";Bg_mi,"Bgse_1000er=";Bgse_1000er,"Bgse_100er=";Bgse_100er,"Bgse_10er=";Bgse_10er,"Bg_sek=";Bg_sek PRINT Bggg,Bg_mi,Bg_sek,Lggg,Lg_mi,Lg_sek,GPS_hoe 'PUT Bggg ' PRINT "Lg_100er=";Lg_100er,"Lg_10er=";Lg_10er,"Lggg=";Lggg,"Lg_mi10er=";Lg_mi10er,"Lg_mi=";Lg_mi,"Lgse_1000er=";Lgse_1000er,"Lgse_100er=";Lgse_100er,"Lgse_10er=";Lgse_10er,"Lggg=";Lggg ' PRINT "Lggg=";Lggg,Lg_mi,Lg_sek ' PRINT "Hoe1000er=";Hoe1000er,"Hoeh100er=";Hoe100er,"Hoe10er=";Hoe10er,"GPS_hoe=";GPS_hoe ' PRINT GPS_hoe 'PUT GPS_hoe GOTO Start END '************** Subroutinen ' Subroutine GetGPSData holen von GPS Modul ' wichtige Hinweise: ' Habe hier zum testen vom PC_2 eine Text Datei mit NMEA gesendet s. Anlage 1_CYCTE.TXT; ' diese enthaelt 5 NMEA Pakete zu je 186 Zeichen/Paket; im ersten Teil je Paket befindet sich ' die ausgewerteten GPGGA Daten fuer Breiten-, Laengen-Grad und Hoehe ' zwischen den Paketen war kein Abstand bei der gesendeten Textdatei; im realen GPS Modul werden die ' 186 zeichen mit Baud38400 innerhalb 0,32 msec gesendet, dann ist 0,68msec Pause ' anschliessend kommt das naechste Paket; dies entspricht 10 Hz Pakettransfer ' R38400: es koennen nur 3 reduzierte Pakete statt der 5 ausgewerteten Datenpakete gesendet werden ' im realen Fall sind aber 0,68msec Pause, sodass alle ankommenden Datenpakete ' ausgewertet werden sollten ' hier eine Auflistung der ausgewerteten Datenpakete, je nach Terminal-Software ' Sendeterminal Hyperterminal bzw. Win3_Terminal.exe ' R38400 3 kann keine 38400 ' R19400: 5 5 ' R9600: 5 1 ' R4800: 5 1 ' R2400: 5 1 ' R1200: 5 1 ' R600: hat kein Baud600 1 ' R300: 5 1 ' Die Auswertung der OMACRO ist abhaengig von der verwendeten Terminalsoftware ' Windows3 terminal.exe zeigt anderes Verhalten als Hyper Terminal ' GPS Daten dann direkt von GPS Modul eingelesen, funktioniert fehlerfrei #GPS_Einl ' GPS Daten einlesen UseESCI=ON 'schaltet ESCI ein BAUD R38400 'R300 'moeglich sind 300, 600, 1200,2400,4800,9600,19200,38400 Baud ' die PRINT Befehle verbrauchen ebenfalls Zeit, sodass dadurch ev. ' PRINT "RXD=";RXD 'RXD=-1 falls Zeichen im E-Buffer, ansonsten 0; Ausdruck RXD=0 erfolgt nur beim 1-ten Durchlauf ' PRINT "EsEr=";EsciErr '=-1 falls Zeichen >8 = Groesse E_Buffer; ansonsten 0 ' PRINT "EsPt=";Esciptr '=319 zeigt immer diesen Zahlenwert ' PRINT "Datei mit Zeichen von PC_2 senden" ' IF EsciErr=-1 THEN ' GET Zeichen ' GOTO GPS_Einl ' ELSE ' ENDIF #Zei_emp 'Schleife um Zeichen von gesendeter Datei zu empfangen IF RXD=0 THEN GOTO Zei_emp ' #LF_CR ' pruefen auf Line feed bzw. carriage return ' GET Zeichen ' PUT Zeichen ' IF Zeichen <> 13 THEN GOTO LF_CR 'prueft auf Line Feed ' PUT Zeichen #GPGGA 'ab hier GPGGA Zeichenfolge abfragen u, dann erforderliche Daten einlesen GET Zeichen ' PUT Zeichen IF Zeichen <> 71 THEN GOTO GPGGA ' G GET Zeichen IF Zeichen <> 80 THEN GOTO GPGGA ' P GET Zeichen IF Zeichen <> 71 THEN GOTO GPGGA ' G GET Zeichen IF Zeichen <> 71 THEN GOTO GPGGA ' G GET Zeichen IF Zeichen <> 65 THEN GOTO GPGGA ' A GPGGA empfangen FOR i_zae = 1 TO 12 ' ,hhmmss, =12 Zeichen entfernen GET Zeichen NEXT i_zae GET Bggg_10er ' nun bggg 10er stelle einlesen GET Bggg ' einerstelle GET Bg_mi10er ' bgmin 10er stelle GET Bg_mi GET Zeichen ' entfernen GET Bgse_1000er ' bgsek GET Bgse_100er GET Bgse_10er GET Bg_sek FOR i_zae = 1 TO 3 ' ",N,"entfernen GET Zeichen NEXT i_zae GET Lg_100er GET Lg_10er GET Lggg GET Lg_mi10er ' lgmin GET Lg_mi GET zeichen ' . entfernen GET Lgse_1000er ' lgsek GET Lgse_100er GET Lgse_10er GET Lg_sek FOR i_zae = 1 TO 12 '12 Zeichen entfernen GET Zeichen NEXT i_zae GET hoe1000er GET hoe100er GET hoe10er GET Zeichen IF zeichen <> 46 THEN GPS_Hoe=Zeichen 'falls Zeichen vor Punkt 4 stellig ist ELSE GPS_Hoe=hoe10er ' falls Zeichen vor Punkt 3-stellig ist hoe10er=hoe100er hoe100er=hoe1000er hoe1000er=48 ' Null Eingabe END IF UseEsci=OFF ' 2-te RS232 Schnittstelle de-aktiviert ' ab hier Berechnnung der Werte Bggg =(Bggg-48) +(10*(Bggg_10er-48)) Bg_mi =(Bg_mi-48)+(10*(Bg_mi10er-48)) Bg_sek =(Bg_sek-48)+(1000*(Bgse_1000er-48))+(100*(Bgse_100er-48))+(10*(Bgse_10er-48)) Lggg = (Lggg-48)+(100*(Lg_100er-48))+(10*(Lg_10er-48)) Lg_mi = (Lg_mi-48)+(10*(Lg_mi10er-48)) Lg_sek = (Lg_sek-48)+(1000*(Lgse_1000er-48))+(100*(Lgse_100er-48))+(10*(Lgse_10er-48)) GPS_Hoe= (GPS_Hoe-48)+(1000*(hoe1000er-48))+(100*(hoe100er-48))+(10*(hoe10er-48)) RETURN |
Antwort schreiben |