Hallo liebe Gemeinde, hänge nun schon zu lange in meinem Projekt fest und bräuchte mal nen paar Tips von Euch Profis! Bin gerade dabei mir mit einem GSM/GPS Modul eine Motorradalarmanlage aufzubauen. Beide Geräte benötigen einen Uartport für die Datenauswertung. Ich progge in Bascom einen ATmega644p. Beide Module habe ich am Laufen, auch gemeinsam funktioniert alles gut. Jedenfalls wenn ich Daten nach der GPS-Auswertung per SMS sende habe ich alles wie ich es will.Nun wollte ich mich mit dem Empfang von Daten über GSM beschäftigt und da fängt mein Problem an! Bisher habe ich einen comport vom Mega für die Programmierung über einen Bootloader genutzt, den 2. hängt mein GSM dran. Den GPS-String lese ich per Interrupt und Softuart ein. Mein Problem ist, dass ich den GPS-String dauernd über den Interrupt einlese und auswerte. Rufe ich nun mein GSM an, werden nicht die gesamten GSM-Daten eingelesen. Die Ursache ist der interrupbasierende GPS-Datenempfang. Nun zu meiner Frage: wie würdet Ihr mein Problem lösen? Ich möchte den GPS-String immer einlesen aber auch dabei gleichzeitig einen Datenstring über den anderen Com-Port empfangen wollen. MAT
Ohne den Quellcode kann man praktisch nix sagen. Prinzipiell kannst Du beide UARTs per Interrupt RXC lesen und auch Sendebuffer per TXC realisieren ... kann mir fast nicht vorstellen das da bei "normalen" Baudraten Timingprobleme auftauchen sollten.
Matthias S. schrieb: > Mein Problem ist, dass ich den GPS-String dauernd über den Interrupt > einlese und auswerte. Rufe ich nun mein GSM an, werden nicht die > gesamten GSM-Daten eingelesen. Die Ursache ist der interrupbasierende > GPS-Datenempfang. Zur Not könntest du vielleicht auf die Aktualisierung der GPS Daten verzichten, während du gerade dein GSM anrufst. Oder bist du Dauertelefonierter, so dass die GPS Daten dann hoffnungslos veralten würden? Mit welcher Datenrate kommunizierst du denn mit dem GSM?
Hi! DAnke für Eure Antworten! Das GPS läuft mit 4800 und GSM mit 19600. Die Sache in der ich ein Problem sehe ist, was passiert mit den Daten vom GSM Uart wenn gerade ein GPS-String eingelesen wird? Das GPS Modul sendet 7 verschiedene Strings von max. 70 Zeichen. Aus diesen Strings muss ich mir 2 raussuchen, in der meine benötigten Daten liegen. Ich will aus Bascom die Routinen mit dem gepufferten Empfang nutzen. => jetzt funktioniert schon einmal der gepufferte Empfang vom GPS-String:
1 | Do |
2 | |
3 | If Z = 1 Then |
4 | If _rs_bufcountr1 > 50 And _rs232inbuf1(_rs_bufcountr1) = 13 Then |
5 | Disable Urxc1 |
6 | Print "nmea " ; Nmea |
7 | Gosub Gps_auswertung |
8 | |
9 | End If |
10 | End If |
11 | |
12 | Loop |
13 | Close #1 |
14 | Close #2 |
15 | |
16 | End |
17 | |
18 | |
19 | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GPS-Stringauswertung |
20 | Gps_auswertung: |
21 | Nmea_name = Mid(nmea , 1 , 5) |
22 | Print "Nmea_name = " ; Nmea_name 'Left(nmea , 5) ' NMEA - Messagestring erkennen |
23 | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "GPRMC" ~~~~~~~~~~~~~~~~~~ |
24 | If Nmea_name = "GPRMC" Then |
25 | Nmea_time = Mid(nmea , 7 , 2) + ":" + Mid(nmea , 9 , 2) + ":" + Mid(nmea , 11 , 2) |
26 | Nmea_valid = Mid(nmea , 14 , 1) |
27 | Nmea_latitude_grad = Mid(nmea , 16 , 2) |
28 | Nmea_latitude_min_sec = Mid(nmea , 18 , 7) |
29 | Nmea_n_s = Mid(nmea , 26 , 1) |
30 | Nmea_longitude_grad = Mid(nmea , 28 , 3) |
31 | Nmea_longitude_min_sec = Mid(nmea , 31 , 7) |
32 | Nmea_e_w = Mid(nmea , 39 , 1) |
33 | Nmea_speed = Mid(nmea , 41 , 5) |
34 | Nmea_date = Mid(nmea , 51 , 2) + "." + Mid(nmea , 53 , 2) + "." + Mid(nmea , 55 , 2) |
35 | Latitude_singl = Val(nmea_latitude_min_sec) |
36 | Longitude_singl = Val(nmea_longitude_min_sec) |
37 | |
38 | |
39 | |
40 | '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "GPGGA" ~~~~~~~~~~~~~~~~~~ |
41 | Elseif Nmea_name = "GPGGA" Then |
42 | Nmea_time = Mid(nmea , 7 , 2) + ":" + Mid(nmea , 9 , 2) + ":" + Mid(nmea , 11 , 2) |
43 | Nmea_latitude_grad = Mid(nmea , 14 , 2) |
44 | Nmea_latitude_min_sec = Mid(nmea , 16 , 7) |
45 | Nmea_n_s = Mid(nmea , 24 , 1) |
46 | Nmea_longitude_grad = Mid(nmea , 26 , 3) |
47 | Nmea_longitude_min_sec = Mid(nmea , 29 , 7) |
48 | Nmea_e_w = Mid(nmea , 37 , 1) |
49 | Latitude_singl = Val(nmea_latitude_min_sec) |
50 | Longitude_singl = Val(nmea_longitude_min_sec) |
51 | |
52 | End If |
53 | If Print_debug = 1 Then |
54 | Print "time= " ; Nmea_time ; "," ; Nmea_date |
55 | Print "Latitude= " ; Nmea_latitude_grad ; " " ; Nmea_n_s ; " " ; Nmea_latitude_min_sec |
56 | Print "Longitude= " ; Nmea_longitude_grad ; " " ; Nmea_e_w ; " " ; Nmea_longitude_min_sec |
57 | Print "Speed= " ; Nmea_speed |
58 | Print "Valid= " ; Nmea_valid |
59 | End If |
60 | 'Rs232_dummy = Memcopy(mem_dummy , _rs232inbuf1(1) , _rs_bufcountr1 , 2) |
61 | Nmea = "" |
62 | First_str = 0 |
63 | Nmea_count = 0 |
64 | Enable Urxc1 |
65 | Reset Z |
66 | Return |
67 | |
68 | '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Uart ISR |
69 | 'Uart Interrupt bei jedem eingehenden Zeichen zur Nutzung Erkennung Ende einer Übertragung |
70 | 'wird Timer Count nicht mehr genullt, dann in der Alarmmain auslesen des RS232 Buffer |
71 | Serial1charmatch: |
72 | Clear Serialin1 |
73 | Set Z |
74 | |
75 | Return |
nun will ich mal schauen wie sich die Auswertung auswirkt wenn ich den 2 uart in betrieb nehme.... Danke schon einmal bis dahin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.