keiner einen rat oder Tipp?
Hallo,
es geht um folgendes Vorhaben, nämlich Luftbildfotografie von einem am Himmel stehenden Drachen aus:
KAP-Rig
Grds. realisieren die Leute dies über eine RC-Fernsteuerung aus dem Modellbaubereich.
Ich habe nun eine Schaltung aufgebaut, bei der die Kameraeinheit, das KAP-Rig, per XBee an eine (noch nicht vorhandene) Bodenstation angebunden ist.
Ich überlege gerade, wie die Kommunikation, also der Syntax aussehen sollte - bin Bascom-/AVR-Anfänger!
uC ist ein Atmega8, gespeist durch einen 2S LiPo.
Folgende Parameter müssen übertragen werden:
- Temperaturwert mit Komma von DS18B20Z 1Wire
- Spannung des 2S-LiPo
- Höhe über NN von Navilock NL-504ETTL (soll am Boden gegengerechnet werden!)
- Empfang von Befehlen und Quittierung dieser
Ich würde mich am String des NMEA-Syntax orientieren bspw.:
Sendesyntax zu Bodenstation: $GROUND#quittierung#zellspannung#gpshoehe#Temperat ur#
Sendesyntax zu KAPRIG/Drachen: $KAPRIG#commands#nn#nn#nn#nn#
Dann würde ich mir den String aufteilen, orientiert an den "#"...
Habt ihr Tipps, wie es einfacher und natürlich besser gehen würde?
Danke,
Christoph
keiner einen rat oder Tipp?
Wenn du dich schon an NMEA orientierst, würde ich einfach zusätzliche Sentences designen und die in die Kommunikation einschleifen.
So bleibst du konform zu NMEA und kannst deine Daten auch mit anderer Software auswerten.
Rein vom Performance-Aspekt her würde ich natürlich ein binäres Format bevorzugen.
So z.B.
Offset Länge (Bytes) Wert 0 2 Temperatur 2 2 Batteriespannung 4 2 Höhe 6 1 Flags
evtl. noch weitere Felder für Lat/Lon etc.
Über die Flags könntest du ACK/NACK für gesendete Befehle geben.
Hallo lokirobotics,
ich muss zugeben, dass ich deinen Hinweis nicht ganz verstanden habe...
Du meinst umrechnen in binär und dann übertragen?
Aktuell sieht / soll es so aussehen:
$GROUND#01#7.1#29.9#67.8
| | | |
| | | -- Höhe in Metern
| | -- Grad in Celsius
| |-- Spannung in Volt
|-- "Quittierung" als Byte
Ich habe nun schon jede Menge gelesen etc. und ausprobiert...
Ich habe leider keinen Erfolg! Das hier habe ich auch ausprobiert, aber irgendwas mache ich falsch:
Befehls_zeichen = Inkey() ' Zeichen einlesen
If Befehls_zeichen = 36 Then Input , Befehlsdaten Noecho ' ist "$" vorhanden, dann Daten/HardUART einlesen >> Befehlsdaten
Befehls_header = Mid(befehlsdaten , 1 , 6) 'ersten 6 Zeichen nach Befehls_header einlesen
If Befehls_header = "KAPRIG" Then 'wenn KAPRIG Befehlssatz, dann
Befehls_anzahl = Split(befehlsdaten , Befehls_teilstring(1) , "#") 'aus Befehlsdaten in 5 Teilstrings/Arrays, getrennt durch "#", aufteilen
Befehlsdaten = "" 'befehlsdaten leeren
Gosub Commands ' Auswertung der Befehle/Teilstrings in Subroutine "commands"
End If
Ich bin auf der Suche nach einer Lösung bei der ich mir einen String wie den hier:
$GROUND#01#7.1#29.9#67.8 und den NMEA String auflösen und einfach auf die einzelnen Teilstrings, getrennt durch "#" zugreifen kann....
Danke für eure Hilfe!
Ich muss nochmal fragen: Ist es notwendig, deine Datensätze anders zu formattieren, als die NMEA-Datensätze?
Gesetzt den Fall, du baust deine Datensätze NMEA-Konform auf. Dann kannst du in einer zentralen Routine immer einen ganzen
Satz einlesen, in eine Datenstruktur überführen und diese dann anhand ihres Tags an eine speziellere Auswertefunktion übergeben.
Ich würde auch davon abraten, diverse Felder nur vielleicht zu übertragen. Das ist immer eine potenzielle Fehlerquelle.
Alle Felder sollten immer vorhanden sein.
Aus deinem Code in dem Kommentarfeld werde ich nicht schlau.
Wenn du den String nur anhand der Hashes trennen willst, benutze einfach die Split-Funktion.
Bascom Split
Hallo,
zum einen möchte ich per SW UART das GPS Signal einlesen, um so die Höhe zu verwenden (ich brauche z. Zt. nur die Höhe).
Weiterhin möchte ich Steuersignale vom Boden in die Luft per RS232 über XBee übetragen. Hierbei kann ich ja ein Byte senden und in der Luft das Byte einlesen und entsprechend was tun...
Weiterhin wird aus der Luft zum Boden eine Quittierung für den vom Boden ausgesandten Befehl geschickt. Hierdran sollen auch die Temperatur, die (GPS-)Höhe und die Spannung der Versorgung in der Luft mitgesendet werden.
Fest nach dem NMEA Satz ist natürlich nur das GPS Signal, um die Höhe zu bestimmen. Alles andere ist total frei!
Den o. g. Code habe ich aus dem Bascom-Buch von Stefan Hoffmann. Da ist ja der Split Befehl enthalten, aber irgendwie will das nicht....
Ich sende von einem Atmega8 folgenden String:
die Variablen werden auch entsprechend gefüllt und ich kann sie empfangen, wenn ich das XBee Modul direkt an meinen PC anschliesse und die Daten in das Terminal einlese...Print "$ground" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe
mit dem o. g. Code möchte ich per Input den String in einen Atmega16 einlesen. Inkey() für das $-zeichen und Input für den String... Aber da stimmt etwas nicht...
Danke für Deine/Eure Hilfe
Hey spelli. So sollte es eig gehen:
Dim Dollarzeicheneingang As Byte 'Beginn des Datenstrings mit Dollarzeichen
Dim Teildaten(14) As String * 12 ' Array mit den extrahierten Daten
Dim Anzahl As Byte
Dim Datenstring As String * 98
Dim Datenkopf As String * 6
Do
Dollarzeicheneingang = Inkey()
If Dollarzeicheneingang = 36 Then Input Datenstring Noecho '36 ist das Dollarzeichen
Datenkopf = Mid(datenstring , 1 , 5)
If Datenkopf = "Ground" Then
Cls
Anzahl = Split(datenstring , Teildaten(1) , "#") '# Trennzeichen der Daten
Datenstring = ""
'Dann kann man sich die extrahierten Datenstücke einzeln anzeigen lassen
' Beispiel:
Locate 2 , 1
Lcd Teildaten(3)
End If
Loop
End
Hallo da_miez3,
danke für deine Hilfe!
den teilstring(3) konnte ich mir nicht anzeigen lassen, dafür konnte ich mir per lcd dollarzeicheneingang die "36" anzeigen lassen
-> $ Zeichen kommt schon mal an... Allerdings hat er alle anderen zeichen angezeigt, soweit ja nicht schlimm, da alles per Inkey kommt.
auch mit lcd datentring kommt nichts...
Probiers mal damit, war wohl fehlerhaft:
$regfile = "m32def.dat"
$crystal = 1000000
$baud = 4800 'serial ing
Config Serialin = Buffered , Size = 100 ' konfig serial in
Enable Interrupts
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 20 * 4
Cls
Cursor Off
Dim Gelesen As Byte 'dollarzeichen einlesen
Dim Teilstring(14) As String * 12
Dim Anzahl As Byte
Dim Datenstring As String * 98
Dim Header As String * 6
Dim Tempstring As String * 2
Do
Gelesen = Inkey()
If Gelesen = 36 Then Input Datenstring Noecho
Header = Mid(datenstring , 1 , 6)
If Header = "GROUND" Then
Cls
Anzahl = Split(datenstring , Teilstring(1) , "#")
Datenstring = ""
'Test
Locate 3 , 1
Lcd Teilstring(2)
Wait 2
End If
Loop
End
Hallo,
also über ein print gehd das hier raus:
Zeige ich mir "gelesen" auf dem LCD an, so wird dort immer wieder neu "028" angezeigt...$ground#quit-test#7.1#24.6#gpshigh
aber kein teilstring...
Lesezeichen