PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GPS-Empfangs-Probleme



holzi
17.10.2007, 13:43
Hallo an die gesamte Runde hier,
ich habe durch Zufall einen GPS-Empfänger vom ersten Aldi-PDA bekommen. Der Anschluss war schnell gefunden und zusammen mit einem Terminalprogramm funktioniert das auch, d.h. ich sehe im Terminalprogramm sämtliche empfangene Daten.
Hier ein Beispiel dafür:
$GPRMC,001642.937,V,0000.0000,N,0000.0000,E,,,2701 02,,*B

Dieses möchte ich nun auch mit meinem RN-Control durchführen. Also habe ich mir mit Bascom ein kleines Programm geschrieben und den GPS-Empfänger an Port A.3 angeschlossen.
-------------------------------------------------------------------------------
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600

Open "Coma.3:4800,8,N,1" For Input As #2 ' GPS-Input

Do
Print Waitkey(#2)
Loop
Close #2
End 'end program
--------------------------------------------------------------------------------
Schaue ich mir nun die empfangenen Daten an, sehe ich ausser immer wieder kehrende Zahlen nichts anderes.
Hier die empfangenden Zahlen:
0
0
0
0
0
0
0
184
175
150
243
157
166
42
54
166
230
62
62
62
78
57
243
62
70
62
62
234
154
19
166
54
78
58
41
0
0
0
0

Kann mir jemand einen Tip geben, was ich hier falsch mache. Ich kann auch den Empfänger an Port B.0 anschliessen und im Programm die entsprechende Zeile in
Open "Comb.0:4800,8,N,1" For Input As #2
ändern.Das Ergebnis bleibt gleich. Es erscheinen nur diese hier angegebenen Zahlen.

Peter

recycle
17.10.2007, 20:54
Laut dem Beispile in der Bascom Hilfe wird der WaitKey-Befehl so angewendet:


A = Waitkey()

Hierbei kann A eine numerische oder eine String Variable sein.

Bei deinem Befehl "Print Waitkey(#2)" gibts du dem Compiler keinen Hinweis, was über waitkey empfangen werden soll.


Könnte es sein, dass der Compiler dann nicht unbedingt mit einem String der passenden Länge rechnet und einfach von einem einzelnen Zeichen ausgeht für das er dann den Ascii-Wert ausgibt?

Hast du es schon mal so versucht, wie es in der Hilfe steht?

Dim A As String * 20
A = Waitkey()
Print A
.........

Crazy Harry
18.10.2007, 13:02
ich lese die werte (natürlich) als string ein und zwar zusammenhängend immer bis ein komma gefunden wird. die datensätze sind immer gleich aufgebaut und selbst wenn keine daten verfügbar sind, werden eben die trenn-kommas mit nichts dazwischen gesendet ;)

holzi
18.10.2007, 13:08
Hallo Crazy Harry und recycle,
vielen Dank für den Tip. Nach ein paar weiteren Überlegungen hier nun die Lösung:
-------------------------------------------------------------------------------------
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 32

Dim A As String * 20
Open "Com1:9600,8,N,1" For Output As #1 ' COM 1 Output
Open "Coma.3:4800,8,N,1,inverted" For Input As #2 ' GPS-Input

'$GPRMC,191410,A,4735.5634,N,00739.3538,E,0.0,0.0, 181102,0.4,E,A*19

Do
A = Waitkey(#2);
Print #1 , Chr(A);
Loop
Close #1
Close #2
End 'end program
-----------------------------------------------------------------------------------
Die empfangenden Daten sehen nun wie folgt aus:
$GPRMC,003446.872,V,0000.0000,N,00000.0000,E,,,270 102,,*1A
$GPRMC,003447.872,V,0000.0000,N,00000.0000,E,,,270 102,,*1B
$GPRMC,003448.871,V,0000.0000,N,00000.0000,E,,,270 102,,*17
$GPRMC,003449.871,V,0000.0000,N,00000.0000,E,,,270 102,,*16
$GPRMC,003450.871,V,0000.0000,N,00000.0000,E,,,270 102,,*1E
$GPRMC,003451.871,V,0000.0000,N,00000.0000,E,,,270 102,,*1F
$GPRMC,003452.871,V,0000.0000,N,00000.0000,E,,,270 102,,*1C
--------------------------------------------------------------------------------
Nun kann ich mit der Auswertung dieser Daten beginnen.

Peter

Crazy Harry
18.10.2007, 13:32
ich hab das so gemacht



Process ReadGPS(20,20:iData);
Begin
WaitPipe(RXBuffer); // Warte auf Daten im Puffer
Read(SerInp, Temp); // Puffer lesen

If Temp='$' // Wenn Puffer='$' (Datensatzanfang)
then
Read(SerInp, Temp6);
If Temp6 = 'GPRMC,'
then
Read(SerInp, NMEA.Time_UTC, ',');
Read(SerInp, NMEA.Status, ',');
Read(SerInp, NMEA.Latitude, ',');
Read(SerInp, NMEA.Lat_Ind, ',');
Read(SerInp, NMEA.Longitude, ',');
Read(SerInp, NMEA.Log_Ind, ',');
Read(SerInp, NMEA.Speed, ',');
Read(SerInp, NMEA.Angle, ',');
Read(SerInp, NMEA.Date, ',');
Read(SerInp, NMEA.Magnetic, ',');
Read(SerInp, NMEA.Checksum, ',');
EndIf;

If Temp6 = 'GPGGA,'
then
Read(SerInp, NMEA.Time_UTC, ',');
Read(SerInp, NMEA.Latitude, ',');
Read(SerInp, NMEA.Lat_Ind, ',');
Read(SerInp, NMEA.Longitude, ',');
Read(SerInp, NMEA.Log_Ind, ',');
Read(SerInp, NMEA.StatusDummy, ',');
Read(SerInp, NMEA.Sat_Track, ',');
Read(SerInp, NMEA.H_Dilution, ',');
Read(SerInp, NMEA.Height, ',');
Read(SerInp, NMEA.Height_Unit, ',');
Read(SerInp, NMEA.DGPS_Time, ',');
Read(SerInp, NMEA.DGPS_ID, ',');
Read(SerInp, NMEA.Checksum, ',');
EndIf;
End ReadGPS;


ich werte nur gprmc und gpgga aus. allerdings mit einem anderen compiler und als process

gruss
harry

holzi
18.10.2007, 23:11
Hallo Harry,
damit Du weisst, worum es eigentlich geht. Schau Dir mal die folgende Seite an:
http://www.inter-save.com/UntitledFrameset-4.html
Ich will auf diese Art auch die Geschwindigkeit messen (wird sich max. um 80 Km/h handeln) und einen Kompass auf mittels GPS benutzen.

Peter

recycle
19.10.2007, 00:14
@holzi,


Dim A As String * 20
Open "Com1:9600,8,N,1" For Output As #1 ' COM 1 Output
Open "Coma.3:4800,8,N,1,inverted" For Input As #2 ' GPS-Input


Verwendest du in deinem Programm tatsächlich eine String mit 20 Zeichen? Die 20 hatte ich in meinem Post eigentlich nur beispielhaft gemeint, weil ich nicht weiss wie lang so ein kompletter Datensatz werden kann.

Falls dein Programm wirklich mit "Dim A As String * 20" funktioniert, liest dein Programm einen Datensatz in mehreren Waitkey()-Schritten ein.

Wenn das so ist, würde ich doch lieber versuchen die String-Länge auf die Länge des Datensatzes anzupassen.

Wenn du die Daten direkt hintereinander mit dem Print-Befehl ausgiibst, fällt es nicht auf, sobald du die Daten zwischen den einzelnen Waitkey()-Befehlen aber weiterverarbeitest, dürfte es Probleme geben, wenn du die Datensätze in 20-Zeichen Blöcken einliest.

Crazy Harry
19.10.2007, 07:38
hi peter,

ich messe auf diese art die geschwindigkeit, fahrtrichtung, höhe. naja messen ist wohl falsch: der empfänger bereitet alles auf und ich zeige es an :D

cu
harry

[edit] interessante sache :) nur leider hab ich für sowas keine zeit :(

holzi
20.10.2007, 12:34
Guten morgen,
ich habe die 20 Zeichen des Strings vergessen zu ändern. Es funktionierte und dann habe ich mir keine weiteren Gedanken gemacht. Mitlerweile habe ich das auf 1 runtergesetzt. Da ich auf diese Art die Daten seriell ja einlese, schreibe ich die so empfangenen Zeichen in ein Array und werte sie dann aus. Funktioniert nun hervorragend.
Das Bild sieht sehr interessant aus. Sieht mir nach einem kleinen externen Display aus. Das ganze z.B. dann für das Auto. Wäre auch etwas für mich diese Idee.

Peter

Crazy Harry
22.10.2007, 15:19
fast richtig :) - das display ist 38x61mm (sichtfläche) groß und an einer ZX12-R montiert. 128x64 pixel. µC ist ein mega128 @ 16 mhz

recycle
22.10.2007, 19:56
@holzi


ich habe durch Zufall einen GPS-Empfänger vom ersten Aldi-PDA bekommen. Der Anschluss war schnell gefunden und zusammen mit einem Terminalprogramm funktioniert das auch, ...


Wie hast du eigentlich die Belegung für den Anschluss herausgefunden?

Ich habe hier auch noch einen GPS-Empfänger herumliegen, den ich irgendwann mal bei Ebay gekauft habe. Der war auch von irgendeinem PDA, ich habe aber leider nie rausgefunden von welchem.

Hast du die Anschlussbelegung über die Steckerbelegung rausbekommen oder hast du das Ding dafür auseinandergenommen?

holzi
22.10.2007, 20:13
Einen schönen Abend an diese Runde,
das Problem mit den Anschlüssen war recht schnell erledigt. Als erstes den Stecker aufgeschraubt und nmal geschaut. Die Kabel mit den Farben rot und schwarz war durch genaues hinsehen dann als Stromversorgung erkannt. So blieben noch die beiden anderen Kabel mit den Farbe weiss und gelb übrig. Da der PDA mit einer Stromversorgung von 5 V arbeitet, habe ich 5 V an rot mit der schwarzen Masse gelegt.
Dann einen 9 poligen Sub D Stecker an COM 1 gesteckt und mit einem Terminalprogramm, dass ich auf 4800 Baud, 8, N, 1 eingestellt habe, einmal an weiss und einmal an gelb gemessen bzw. an die COM angeschlossen. Bingo, der Daten-Output läuft über gelb. Wofür weiss ist, weiss ich nicht.

Rot + 5V
Schwarz Masse
Gelb Datenoutput bzw. Gelb ist der Dateninput an der Com

Das war es auch schon.

Einen schönen Abend noch

Peter