Bascom NMEA Checksum XOR

fofi1

Mitglied
09. Jan. 2010
116
1
18
Sprachen
Hi,

ich spiele derzeit mit einem PA6C GPS rum und habe gestern meine Auswertung geschrieben. Da es für meine Verwendung (GPS Tracker) wichtig ist dass die Daten auch wirklich richtig sind will ich die Checksumme überprüfen. Soweit so gut....in der Theorie. Mein Onlinerechner und mein Taschenrechner bekommen beide die gleiche Checksumme raus, nur Bascom macht anscheinend irgendwo etwas anders.

Hier mal der Codeausschnitt, der das ganze Ausrechnen soll:



CodeBox BascomAVR

$regfile = "m328def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 120
$baud = 9600

Debug On

'## IO-Deklaration ##
Cs Alias Portb.0
En_v_lipo Alias Portc.1
Led_o Alias Portc.3
Led_u Alias Portd.2
Dio1 Alias Portd.4
En_gps Alias Portb.2

Config Cs = Output
Config En_v_lipo = Output
Config Led_o = Output
Config Led_u = Output
Config Dio1 = Input
Config En_gps = Output

'## Variablen ##
Dim Empfangen As String * 80
Dim Startbyte As Byte
Dim Gps_freigabe As Bit
Dim Ext_power As Bit
Dim Auswertung As Bit
Dim Universalstring As String * 80
Dim I As Byte
Dim Stellen As Byte
Dim Anfang As Byte
Dim Ende As Byte
Dim Sats As Byte
Dim Hdop As Single
Dim Altitude As Single
Dim Ew As Bit
Dim Ns As Bit
Dim Satfix As Byte
Dim Latstring As String * 8
Dim Longstring As String * 9
Dim Latitude As Double
Dim Longtitude As Double
Dim Crc_cnt As Byte
Dim Crc As Byte
Dim Crc_s As String * 1

'## ADC Init ##
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'## SPI Init ##
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 0


'## HW-Voreinstellungen ##
Spiinit
Enable Interrupts
Cs = 1

'## Variablen init ##
Gps_freigabe = 1
Ext_power = 1

'## Debugmeldung ##
Print "HW-Init beendet"

'*******************************************************************************
'                             MAIN-Loop
'*******************************************************************************

'GPS einstellen
Print "$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"   'GGA Protokoll
'Print "$PMTK314,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28"   'GGA und VTG  Protokoll



Do

   If Gps_freigabe = 1 Then
      If Ext_power = 1 Then                                 'Kein Powersave, also LED an
         Led_o = 1
      End If

      Do                                                    'Warten auf Paketanfang
         Startbyte = Waitkey()
      Loop Until Startbyte = "$"


      Input Empfangen Noecho                                'String einlesen (ohne dollar)


      Universalstring = "GPGGA"
      If Universalstring = Left(empfangen , 5) Then         'Falls es ein GPGGA String ist


         'Checksumme bilden
         I = Len(empfangen) - 3
         Universalstring = Mid(empfangen , 1 , I)

         Print Universalstring

         Crc = Checksumxor(universalstring)
         Crc = Hex(crc)

         Universalstring = Right(empfangen , 2)

         Print Crc
         Print "uni--" ; Universalstring


'### hier kommen dann noch die ellenlange auswertung usw.



Ich habe das ganze auch ohne die Bascom-XOR Routine per Hand gemacht. Leider mit dem selben Ergebnis. Im Anhang seht ihr die Ausgabe in Docklight und den Datensatz aus dem die (falsche) CRC generiert wurde. Uni-- ist die CRC die am Ende des Datenpakets mitgeschickt wurde. Davor ist meine errechnete CRC

Fehler-CRC.PNG

Ich hoffe jemand von euch weiß Rat, ich zweifle langsam an meinem Rechner :eek:

EDIT: Online Checksummenrechner: http://www.hhhh.org/wiml/proj/nmeaxor.html
 
Zuletzt bearbeitet:
Lade mal bitte ähnlich Deinem Bild so'n Mitschnitt in einen Code-Block
also:
  • empfangen
  • universalstring
  • die (falsche) berechnete Checksumme (hex(crc))
  • die zu erwartendende Checksumme
 
Hi,

ok ich habe das Programm für die Ausgabe nun so abgeändert:



CodeBox BascomAVR
$regfile = "m328def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 120
$baud = 9600

Debug On

'## IO-Deklaration ##
CS alias Portb.0
En_V_lipo alias Portc.1
Led_o alias Portc.3
Led_u alias Portd.2
DIO1 alias Portd.4
En_GPS alias Portb.2

Config CS=Output
Config En_V_lipo=Output
Config Led_o=Output
Config led_u=Output
Config DIO1=input
Config EN_Gps=Output

'## Variablen ##
Dim Empfangen as string*80
Dim Startbyte as byte
Dim GPS_freigabe as bit
Dim ext_power as bit
dim auswertung as bit
Dim universalstring as string*80
Dim i as byte
dim stellen as byte
dim anfang as byte
dim ende as byte
Dim Sats as Byte
Dim Hdop as Single
Dim Altitude as single
Dim EW as bit
Dim NS as bit
Dim satfix as byte
dim LATstring as string*8
dim Longstring as string*9
dim latitude as double
dim longtitude as double
dim crc_cnt as byte
dim crc as byte
Dim CRC_s as string*1

'## ADC Init ##
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'## SPI Init ##
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 0


'## HW-Voreinstellungen ##
Spiinit
enable interrupts
Cs = 1

'## Variablen init ##
GPS_freigabe=1
ext_power=1

'## Debugmeldung ##
Print "HW-Init beendet"

'*******************************************************************************
'                             MAIN-Loop
'*******************************************************************************
'GPS einstellen
Print "$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"   'GGA Protokoll



Do

   if gps_freigabe=1 then
      if ext_power=1 then                 'Kein Powersave, also LED an
         led_o=1
      end if

      Do                                  'Warten auf Paketanfang
         startbyte=waitkey()
      loop until startbyte="$"


      input empfangen noecho              'String einlesen (ohne dollar)

      print "Empfangen: ";Empfangen

      universalstring= "GPGGA"
      if universalstring= left(empfangen,5) then 'Falls es ein GPGGA String ist


         'Checksumme bilden
         i= len(empfangen)-3
         universalstring=mid(empfangen,1,i)

         print "String für CRC: "; universalstring

         crc=checksumxor(universalstring)
         crc=Hex(crc)

         universalstring=right(empfangen,2)

         print "Bascom CRC: "; crc
         print "Richtige CRC: ";universalstring



Ausgabe ist dann wie folgt:
Code:
Empfangen: GPGGA,151257.000,4815.7321,N,01232.0406,E,1,6,1.58,414.9,M,46.9,M,,*5F<CR><LF>
String für CRC: GPGGA,151257.000,4815.7321,N,01232.0406,E,1,6,1.58,414.9,M,46.9,M,,<CR><LF>
Bascom CRC: 53<CR><LF>
Richtige CRC: 5F<CR><LF>

Empfangen: GPGGA,151258.000,4815.7323,N,01232.0404,E,1,6,1.58,414.7,M,46.9,M,,*5E<CR><LF>
String für CRC: GPGGA,151258.000,4815.7323,N,01232.0404,E,1,6,1.58,414.7,M,46.9,M,,<CR><LF>
Bascom CRC: 53<CR><LF>
Richtige CRC: 5E<CR><LF>
48157323<CR><LF>

Empfangen: GPGGA,151259.000,4815.7328,N,01232.0399,E,1,6,1.58,414.5,M,46.9,M,,*55<CR><LF>
String für CRC: GPGGA,151259.000,4815.7328,N,01232.0399,E,1,6,1.58,414.5,M,46.9,M,,<CR><LF>
Bascom CRC: 53<CR><LF>
Richtige CRC: 55<CR><LF>
 
Kurz: JA. Wenn ich selber per Hand rechne erzeugt es zwar auch falsche Werte aber wenigstens kommt immer wieder was anderes raus. Ich schreib das nochmal per Hand und lad alles hoch. Ist echt ein komisches Problem.
 
Ach Herrje, Hex gibt ja einen string zurück (eigentlich klar) :banghead: . Ja jetzt gehts auch. Manchmal sitz ich einfach brutal auf dem Schlauch.

Danke dir für deine Zeit und Hilfe. Du hast mir echt grade den Abend gerettet :victory:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)