- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: Syntax für UART Kommunikation

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72

    Syntax für UART Kommunikation

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:

    Code:
    Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe
    $GROUND#quittierung#7,4#23,1#64

    Danke für Anregungen!

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    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.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo Kampi,

    verstege ich das so richtig:



    Code:
    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

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    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.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Zitat Zitat von for_ro Beitrag anzeigen
    Kennst du das Konzept der Overlays?
    Hallo, leider nein. Soweit stecke ich noch nicht drin.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    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.

Ähnliche Themen

  1. Probleme mit UART Kommunikation
    Von curzon161 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 28.08.2011, 18:17
  2. Problem mit UART Kommunikation
    Von Testus2K im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 30.05.2011, 14:41
  3. Protokoll zur UART Kommunikation PC<->AVR
    Von Christoph2 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 25.06.2010, 17:56
  4. µC Kommunikation via UART?
    Von Killer im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 24.12.2007, 03:22
  5. Uart-Kommunikation zwischen µCs
    Von ProgDom im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 20.04.2006, 01:37

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests