- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Ende des Strings beim UART ?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.05.2007
    Beiträge
    329

    Ende des Strings beim UART ?

    Anzeige

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

fchao-Sinus-Wechselrichter AliExpress