- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Brauche Hilfe beim UART

  1. #1
    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

    Brauche Hilfe beim UART

    Anzeige

    Praxistest und DIY Projekte
    Hallo Forum,

    ich arbeite zur Zeit etwas an meinem CAN-Bus weiter.
    Nun möchte ich, dass der Controller bestimmte Dinge automatisch einstellt sobald ein bestimmter Befehl gesendet wurde. Ein Beispiel:
    Der Filter 0 von Buffer 0 soll von 1 auf 2 geändert werden. Dazu möchte ich z.B. den Befehl "Config B0 F0 2" per UART an den Controller senden und er soll es empfangen und in einen String packen.
    Nach dem Empfangen des Strings soll er diesen auswerten und anschließend von Buffer 0 RXF0 mit 2 beschreiben.
    Allerdings tu ich mich gerade beim Empfangen und Auswerten des Strings schwer -.-
    Ich würde das gerne per UART_Interrupt erledigen, damit es möglichst wenig Einfluss auf das Programm hat. Das Ende des Befehls möchte ich am besten mit nem CR und nem LF, sprich 0x0D und 0x0A, kennzeichnen.
    Hat jemand eine Idee wie man das am besten bewerkstelligen könnte?

    Ich habe es schon so probiert:

    Code:
    Uart_recieved:    
    Index = Index + 1
    Input_uart(Index) =  Input_uart(Index) + Chr(UDR)
    Aber die Lösung war nicht wirklich zufrieden stellend bzw. ich weiß jetzt nicht wie ich den String nach bestimmten Parametern trennen kann.
    Danke für die Hilfe!
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Kampi,
    ist dies hier Input_uart(Index) als String oder als Byte Array definiert?
    Wenn du sagst, dass du den String nach bestimmten Parametern trennen willst, was meinst du damit genau? Zum Trennen hast du doch schon die Leerzeichen in dem übertragenen String. Kannst du die nicht dafür nutzen?
    Ich würde mir auch nicht einen String im UART zusammenbauen, dass dauert meist viel zu lang.
    Lege einfach ein Byte-Array über deinen String und speicher das gelesene Zeichen in das Array.

    Input_string as string*20
    Input_string_overlay as Byte(20) at Input_string Overlay
    ...
    Uart_isr:
    incr bytes_received
    Input_string_overlay(bytes_received)=UDR
    Return

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Hallo Kampi!


    Meine "ClockTemp" für den Schreibtisch kann so etwas ähnliches. Dabei werden Befehle per Terminal über die UART an den Controller gesendet und ausgewertet. Die Terminalsteuerung übernimmt vollständig der Controller.
    Das Prinzip funktioniert so: Wenn eine Taste gedrückt wird, wird das entsprechende Zeichen an den Controller gesendet. Dieser speichert es ab und gibt es an das Terminal wieder aus, damit es auch sichtbar ist. Wird ein CR empfangen (=ENTER auf der Tastatur) wird eine Auswertung gestartet, welche die gespeicherte Zeichenkette zerlegt und zuordnet. Wenn zuviele Zeichen eingegeben werden gibt es eine Fehlermeldung.

    Bei meiner Methode muss allerdings der Befehl immer gleich aufgebaut sein. Zum Beispiel:
    BEFEHL [leerzeichen] VARIABLE
    Ein realer Befehl aus der ClockTemp-Firmware V1.3 lautet:
    TIM 2034 --> setze die Uhrzeit auf 20.34 Uhr.

    Die Variable nach dem Leerzeichen ist dabei allerdings optional. Ich verwende zum Beispiel STL (ohne Leerzeichen oder sonstiges, einfach nur mit ENTER abschließen) für die Statusausgabe (STL="Status list").

    Eine weitere Besonderheit ist, dass der Befehl nur drei Zeichen lang sein darf. Es wird nämlich der String nach fixen Vorgaben zerlegt: Die ersten drei Zeichen sind der auszuführende Befehl, das Leerzeichen wird ignoriert und ab der fünften Stelle im String kommt eine Variable.

    Ursprünglich wollte ich die Sache noch etwas weiter entwickeln, allerdings habe ich das Projekt inzwischen abgeschlossen und erfreue mich daran. Im Anhang findest du einen Auszug aus dem Quellcode. Ich habe diese Beschreibung aus Zeitmangel nur schnell zusammengeschrieben, da ich etwas unter Zeitdruck bin aber trotzdem mal einen Lösungsansatz liefern möchte - wenn du Fragen zu meiner Variante hast, dann frag bitte einfach. Warscheinlich ist das jetzt nicht genau die Lösung die du suchst, aber vielleicht konnte ich dir einen Denkansatz geben. Eventuell könnten wir die Sache auch gemeinsam angehen, da mich die Thematik auch interessiert.

    Übrigens: Ich weiß, dass diese Eingabemethode vielleicht nicht unbeding elegant und sauber programmiert ist, sie funktioniert allerdings tadellos auf meiner Anwendung und erfüllt ihren Zweck.

    Code:
    Communication:
    
       Led = 0
       Buffer = Inkey()                                         'Variable "Buffer" mit dem empfangenen Zeichen laden
       If Buffer <> Chr(13) Then                                'Wenn "Buffer" KEIN ENTER ist, dann an "Eingabe" anreihen
          Print Buffer;                                         'Ausgeben des angereihten Zeichens
          Eingabe = Eingabe + Buffer
          If Len(eingabe) = 9 Then                              'Wenn Eingabe neun Zeichen lang ist, dann abbrechen
             Eingabe = ""                                       'Eingabe = leer
             Print
             Print "TOO LONG..."
          End If
       Else                                                     'Wenn "Buffer" ENTER beeinhaltet
          Ein_command = Mid(eingabe , 1 , 3)                    '"Ein_command" = erste drei Zeichen
          Ein_value = Mid(eingabe , 5)                          '"Ein_valaue" = Fünftes bis Achtes Zeichen
          Eingabe = ""                                          '"Eingabe" = leer
          Print
       End If
       If Buffer = "°" Then                                     'Wenn Buffer "Grad"-Zeichen beeinhaltet
          Eingabe = ""                                          '"Eingabe" = leer
          Print "ABORTED"                                       '"ABORTED" ausgeben
          Print "-----"
       End If
       If Ein_command = "tim" Then                              'Eingabe "tim" (Neue Zeit)
          Ein_command = Mid(ein_value , 1 , 2)                  'Ein_command für Stunde missbrauchen
          Stunde = Val(ein_command)                             'Direktes Umwandeln der Zeichen
          Ein_command = Mid(ein_value , 3 , 2)                  'Ein_command für Minute missbrauchen
          Minute = Val(ein_command)                             'Direktes Umwandeln der Zeichen
          Sekunde = 0                                           'Sekunde auf null setzen
          Print "New Time: " ; Stunde ; ":" ; Minute            'Neue Zeit ausgeben
          Print "-----"
       End If
       If Ein_command = "stl" Then                              'Eingabe "stl" (Status-List)
          Print "Status:"
          Print "--------------------"
          Print "Voltage in:   " ; Volt_single ; "V"
          Print "ADC-Value:    " ; Volt
          Print "Temp MSB:     " ; Temp_h
          Print "Temp LSB:     " ; Temp_l
          Print "Temp:         " ; Temp_single
          Print "Block:        " ; Block
          Print "Adress:       " ; Adresse
          Print "Space:        " ; Speicher ; "%"
          Print "Log-interval: " ; Intervall_soll ; "min"
          Print "Interval-Ct:  " ; Intervall_ist ; "min"
          Print "-----"
       End If
       If Ein_command = "red" Then Gosub I2c_readtemp           'Eingabe "red" (Log-Lesen und ausgeben)
       If Ein_command = "del" Then Gosub I2c_delete             'Eingabe "del" (Löschen)
       If Ein_command = "low" Then                              'Eingabe "low" (Anzeige letzter Spannungseinbruch)
          Print "Last low voltage condition:"
          Print "--------------------"
          Readeeprom Stunde_read , 1
          Readeeprom Minute_read , 2
          Readeeprom Sekunde_read , 3
          Readeeprom Volt_single , 4
          Print Stunde_read ; ":" ; Minute_read ; ":" ; Sekunde_read
          Print "Voltage: " ; Volt_single
          Print "-----"
          Volt_single = 10                                      'Notlösung: Volt_single auf 10 setzen, damit nicht der falsche Wert angezeigt wird
       End If
       If Ein_command = "int" Then                              'Eingabe "int" (Neues Log-Intervall setzen)
          Ein_command = Mid(ein_value , 1 , 3)                  'Ein_command missbrauchen
          Intervall_soll = Val(ein_command)                     'Direktes Umwandeln der Zeichen aus Ein_command
          If Intervall_soll >= 1 And Intervall_soll =< 99 Then  'Wenn Intervall innerhalb der zul. Werte
             Print "Set new interval: " ; Intervall_soll ; "min"
             Print "-----"
          Else                                                  'Wenn Intervall ausserhalb der zul. Werte
             Print "Not allowed (only 1 to 99 minutes allowed)"
             Print "Interval is set to 1 minute"
             Print "-----"
             Intervall_soll = 1
          End If
       Intervall_ist = 0
       End If
       If Ein_command = "inf" Then                              'Eingabe "inf" (Info/Help)
          Print "Info/Help"
          Print "--------------------"
          Print "[tim hhmm]  : Set Time hh=hours, mm=minutes"
          Print "[stl]       : Status list"
          Print "[red]       : Read temperature-log"
          Print "[del]       : Delete temperature-log (means delete EEPROM)"
          Print "[low]       : Show last low-voltage-condition"
          Print "[int mm]    : Set interval for logging (1 to 99 minutes)"
          Print "[inf]       : You're here! ;-)"
          Print "-----"
       End If
       Ein_command = ""                                         'Abschließend Ein_command = leer und
       Ein_value = ""                                           'Ein_value = leer
       Led = 1
    
    Return
    Grüße
    Thomas

  4. #4
    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
    Hallo,

    danke für die Antworten.

    @for_ro:
    Die Variable war als

    Input_UART(200) as String * 1

    deklariert.
    Die Geschichte mit dem Overlay hört sich aber besser an. Ich denke mal das übernehme ich so.
    Danke für den Hinweis. Die Trennung durch das Leerzeichen........wieso zum Geier bin ich nicht dadrauf gekommen >.<.
    Nochmals danke für den Tipp

    @Thomas:
    Danke für das Beispiel.
    Ich schau es mir mal an. Ein identischer Aufbau der Befehle sollte nicht das Problem sein, aber da muss ich nochmal genauer drüber Grübeln.
    Vom Prinzip hört sich das genau nach dem an was ich benötige.

    Kleiner edit:
    Ich weiß nicht ob ich die Funktion vom Overlay richtig verstanden habe.
    Der Overlay legt jetzt einfach ein 20 Bytes langes 1 Byte Array über den String, sodass ich den String wie ein Array oder einen String behandeln kann.
    Ist das so korrekt?
    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

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zitat Zitat von Kampi Beitrag anzeigen
    @Thomas:
    Danke für das Beispiel.
    Ich schau es mir mal an. Ein identischer Aufbau der Befehle sollte nicht das Problem sein, aber da muss ich nochmal genauer drüber Grübeln.
    Vom Prinzip hört sich das genau nach dem an was ich benötige.
    Man könnte bestimmt auch den Eingangsstring nach einem Leerzeichen absuchen und dann die Stelle ermitteln, ab welcher ein anderer Teil des Befehls (zum Beispiel eine Variable) beginnt. Ich habe mich nur aus Speicherplatzgründen für die einfachere Variante entschieden.

    Warscheinlich werde ich diese oder eine leicht abgewandelte Variante für ein in Planung befindliches Projekt benötigen, also wäre eine Weiterentwicklung von mir vielleicht eine gute Idee. Mal sehen.
    Grüße
    Thomas

  6. #6
    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
    Ich werde mal schauen wie ich das mache.
    Ich habe heute festgestellt, dass es wohl Probleme gibt wenn ich nen Remoteframe sende und anschließend einen Datenframe.....muss erstmal das Problem lösen bevor es an den UART gehen kann :/
    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

  7. #7
    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
    Whuuuu es funktioniert
    Habe jetzt erstmal nur ne Lösung mittels Input und Select Case aber ich kann die Frames problemlos nacheinander schicken
    Jetzt kommt der UART dran
    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

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zeigst du uns deine Lösung? Würde mich interessieren, wie du es gemacht hast.
    Grüße
    Thomas

  9. #9
    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
    Zitat Zitat von Thomas E. Beitrag anzeigen
    Zeigst du uns deine Lösung? Würde mich interessieren, wie du es gemacht hast.
    Es ist noch nicht die Lösung die ich haben will. Die Problemlösung bezog sich darauf das mein Programm für den MCP ein Problem damit hatte wenn ich erst nen Datenframe sende und anschließend einen Remoteframe. Ich dachte ich hätte das Problem gelöst aber es besteht immernoch :/
    Den UART selber habe ich noch nicht bearbeitet.
    Die Lösung war mehr eine Testlösung ^.^
    Aber sobald ich was habe zeige ich sie euch.
    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

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Hatte ich wohl irgendwie falsch interpretiert und gedacht du wertest bereits fleißig Strings aus...
    Grüße
    Thomas

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Brauche Hilfe bei der Kommunikation zweier Atmega über UART
    Von gm4288 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 27.12.2011, 21:47
  2. brauche Hilfe beim Prozessor
    Von Asko im Forum Yeti
    Antworten: 8
    Letzter Beitrag: 04.12.2011, 00:07
  3. Brauche Hilfe beim Umrechnen
    Von a4b68e im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 16.10.2011, 20:47
  4. Antworten: 4
    Letzter Beitrag: 20.02.2008, 18:39
  5. brauche hilfe beim basteln
    Von over load im Forum Elektronik
    Antworten: 15
    Letzter Beitrag: 08.03.2006, 10:03

Berechtigungen

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

LiFePO4 Speicher Test