- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Ende des Strings beim UART ?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329

    Ende des Strings beim UART ?

    Hallo,

    Vom Terminal soll ein String unterschiedlicher Länge zum ATMega8 übertragen werden.
    Dazu wird im URXC Interrupt das Zeichen zum String hinzugefügt.
    Wie frage ich das Ende des übertragenen Strings ab ?
    Code:
     $regfile = "m8def.dat"
    $Crystal = 3686400
    $baud = 38400
    
    Dim S As String * 63 At &H60
    Dim b(11) As Byte At &H60 Overlay
    Dim n As Byte
    
    On URXC OnRxD
    Enable URXC
    Enable Interrupts
    
    Main:
      If N > 62 Then
        'Print s
        n = 0
      End If
    Goto Main
    
    Onrxd:
      If ? Then
    Ende des Strings ist erreicht, er kann jetzt verarbeitet werden
      Else
       Incr N
       B(n) = Udr
      End If
    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    ?=13

    Fragezeichen gleich Dreizehn...
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Das ist der Problempunkt. Wie muss ich das Ende des Strings abfragen ?
    Wie soll der Microcontroller wissen, daß das letzte Zeichen übermittelt wurde ?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Naja, mal das letzte Zeichen abrufen:

    letzteszeichen = RIGHT(empfangenes, 1)

    und dann eben prüfen:

    If letzteszeichen = Endzeichen Then ...

    EDIT: Sorry, zu spät gesehen, dass ja der String eh schon zeichenweise aufgebaut wird... is noch etwas früh...

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo,

    wäre das so richtig ?

    Onrxd:
    If udr = asc(10) or udr = asc(13) Then
    varEnde = True
    return 'Ende des Strings ist erreicht, er kann jetzt verarbeitet werden
    Else
    varEnde = False
    Incr N
    B(n) = Udr
    End If

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Naja... ASC(10) ... macht so ned viel sinn.
    Wenn dann ASC(udr) = 10 oder udr = CHR(10) (sofern udr ein String ist)
    Aber ansonsten dürfts klappen.

    Kann noch sein, dass Bascom nen Umweg will in der Anweisung in der Form:
    xCR = chr(13)
    xLF = chr(10)
    Und dann damit IF udr = xCR or udr = xLF...

    Bascom kann ja blödeweise nur immer 1 "Rechen-Anweisung" pro Zeile.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo Jaecko,

    oops, da habe ich was verdreht...

    ich werds mal so probieren.

    Was hätst du von den Bascom Highlevel Befehlen ?

    wenn ich per configserialin und buffered meinen UART mache, ist das sinnvoller ? Bascom schreibt ja man solle nicht direkt auf die Register zugreifen...

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Ich nehm eigentlich nur die Highlevels her.
    Direktzugriff auf Register hab ich bisher noch nie benötigt.
    (Werd ich wohl auch nur im Notfall verwenden; warum mitm Löffel im Garten rumgraben wenn man nen Bagger hat )

    Direkt über die Register könnts im Fall der Fälle schneller sein.
    (Irgendwo war mal was, dass ne Bascom-Anweisung 300µS braucht, ne direkte nur 80 oder so...)

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329
    Hallo,

    noch ne Frage:

    $regfile = "m8def.dat"
    $crystal = 7372800
    $baud = 19200

    $hwstack = 40
    $swstack = 16
    $framesize = 32

    Config Serialin = Buffered , Size = 63 , Bytematch = 13
    Config Serialout = Buffered , Size = 63

    Dim Rx_char As Byte
    Dim Serinpstr As String * 63
    Dim Cr_received As Bit

    Enable Interrupts


    Do

    If Cr_received = 1 Then
    Cr_received = 0
    Input Serinpstr
    End If

    Loop

    Serial0charmatch:
    Cr_recieved = 1
    Return

    End

    jetzt habe ich das mal mit Highlevels versucht.
    Ist das so richtig ?

    Bleibt durch Bytematch = 13 eventuell ein darauffolgendes 10 im Buffer hängen ?[/code]

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    also.. irgendwie interessant dieser quelltext von guenter1604. das funktioniert ja super.
    aber mal ne fräge dazu:
    1. wo kommt denn der inhalt der variablen Serinpstr her ? da wird ja nirgens was zugewiesen. der inhalt stimmt aber.

    2. und warum wird das gemacht ?

    If Cr_received = 1 Then
    Cr_received = 0

    wer weiss mehr ?

    gruss klaus

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress