PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Syntax für UART Kommunikation



spelli2001
23.06.2012, 08:32
Hallo,

ich mache mittlerweile viel über UART. Dabei übermittel ich Sensorwerte und Befehle.

Momentan nutze ich im Prinzip den NMEA Befehlssatz ($wert1#wert2#wert3#wert4)...

Die Auswertung erfolgt nach einem Code aus dem Bascom Buch von Stefan Hoffmann.
Dabei lese ich per Inkey() ein und warte auf das Dollarzeichen. Dann lese ich per Input
alles ein und teile entsprechen den # Zeichen auf.

Das klappt soweit, aber für eine einfache Kommunikation und Übertragung müsste es doch
einfacher und performanter gehen...

Ich hätte auch gerne eine Prüfsumme für den gesamten gesendeten Befehl, weiß aber nicht, ob
checksum hier funktioniert:


Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe

$GROUND#quittierung#7,4#23,1#64

Danke für Anregungen!

Kampi
23.06.2012, 09:15
Hey,

du kannst den UART Interrupt nutzen.
Dann ließt du einfach alles was über den UART reinkommt ein und speicherst es in einem Buffer. Sobald ein deffiniertes Zeichen kommt, welches die Übertragung beendet (CR z.B.) kannst du den Buffer in einem festen String speichern und den Buffer löschen.
Den String brauchst du dann nur noch auslesen.
Die $-Zeichen kannst du dabei dann einfach herausfiltern.
Der Vorteil an dieser Methode ist (neben Inkey und Input), dass der Mikrocontroller nicht auf ein Zeichen wartet, da alles per Interrupts geschieht.
Bei Input und Inkey wartet der Controller solange an der Stelle bis ein Zeichen kommt. Gerade wenn du nicht weißt wann ein Zeichen kommt erzeugst du damit undeffinierte Pausen.
Und für die Checksumme....schau dir mal den Befehl "CRC16" an.

spelli2001
23.06.2012, 10:30
Hallo Kampi,

verstege ich das so richtig:




On Urxc Onrxd
Enable Urxc
Enable Interrupts


Do

IF FLAG = true

hier auswerten

flag = false
ENDIF

Loop
End


Onrxd:

Inputstr = Inputstr + Chr(udr)
If Udr = 13 Then Flag = true

for_ro
23.06.2012, 10:58
Hallo Spelli,
grundsätzlich ist es das, was Kampi dir vorgeschlagen hat.
Da ich erklärtermaßen Fan von Overlays bin, möchte ich dir allerdings vorschlagen, in der ISR nicht mit Strings zu arbeiten, sondern bei Bytes zu bleiben, so wie du sie auch einliest. Kennst du das Konzept der Overlays?
Als Checksumme kannst du neben der erwähnten CRC16 auch CRC8 oder auch einfach die Funktion Checksum() benutzen.
Bedenken solltest du dabei, dass der Wert der Checksumme auch zufällig eines deiner Steuerzeichen $ oder # werden könnte. Ebenso könnte es den Wert 13 haben, der deinem "Übertragung fertig" entspricht. Da musst du in der ISR Vorsorge treffen. Oder du verhinderst auf der Sendeseite, dass ein solches Zeichen als Checksumme übertragen wird.

spelli2001
23.06.2012, 11:17
Kennst du das Konzept der Overlays?


Hallo, leider nein. Soweit stecke ich noch nicht drin.

for_ro
24.06.2012, 14:51
Hallo spelli,
die Stringoperationen wie etwa Inputstr = Inputstr + Chr(udr) dauern halt recht lange. Die gleiche Änderung kannst du über Overlays wesentlich schneller machen, weil nichts konvertiert werden muss.
Wenn du aber in der ISR keine Zeitprobleme hast, dann lass es zunächst einfach so.
Ändern kann man das später immer noch.