-         

Ergebnis 1 bis 9 von 9

Thema: Befehle über RS232

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180

    Befehle über RS232

    Anzeige

    Hallo,

    habe mal eine, für viele, sicher ganz einfache Frage.
    Ich möchte mit dem PC Anweisungen über die serielle Schnittstelle senden.
    Der AVR-Empfänger, ein Mega32, arbeitet allerdings ein Programm ab und soll quasi via Interrupt auf die Eingabe über RS232 reagieren.
    Bisher habe ich nur Input gefunden. Dabei wird allerdings das Programm so lange angehalten bis eine Nachricht ankommt.
    Ein weiter Punkt ist die Verarbeitung der kompl. Nachricht.
    Ich habe das so verstanden dass quasi jedes Zeichen eine Nachricht darstellt.
    Wie bekomme ich da einen kompl. Befehl zusammen?

    Tobias

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Du kannst deinen Befehl immer mit dem gleichen Zeichen abschließen, z.B. mit einem <CR>. Dann kannst du im Programm festlegen, dass der µC erst dann reagieren soll, wenn dieses Zeichen empfangen wurde.

    Config Serialin = Buffered , Size = 20 , Bytematch = 13

    Hier liest er also max. 20 Zeichen in den Puffer und springt dann eine Sub an, die bei dem Label (ist fix vorgegeben) steht:

    Serial0CharMatch:

    Dort kannst du dann über eine kleine Schleife die Bytes einlesen

    Code:
    Serial0CharMatch:
       Command_count = 0
       Command_string = ""
       While Ischarwaiting() = 1
          Command_key = Inkey()
          If Command_key <> Chr(13) Then
             Incr Command_count
             If Command_count < 20 Then
                Command_string = Command_string + Chr(command_key)
             End If
          End If
       Wend
       Clear Serialin
    Return
    wobei die Variablen so definiert sind:

    Dim Command_key As Byte
    Dim Command_count As Byte
    Dim Command_string As String * 20

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    super, ich werde es gleich mal ausprobieren,

    Danke

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    gleich mal eine Frage,
    was bedeutet Bytematch = 13?
    Wird das hier benötigt?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Das ist das Zeichen, auf das er wartet, in diesem Fall ein <CR>

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    mmh, das verstehe ich nicht ganz.
    Die Prüfung ob Chr(13) oder 20 Zeichen eingeben wurden erfolgt doch in der Sub.
    Um dort hin zu gelangen muss doch die eigentliche Abfrage vorher laufen!

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Nein, der Test auf <CR> wird unabhängig von deinem Programm gemacht. Das ist im UART integriert. Du brauchst dazu nur das Zeichen anzugeben. Alles was kommt wird in einen Puffer geschrieben, damit hast du auch nichts zu tun. Erst wenn das Zeichen auftaucht, wird der Interrupt ausgelöst und du kannst die Zeichen aus dem Puffer eins nach dem anderen einlesen.
    Ich test in der Sub auch noch mal auf 13, aber das ist nur, weil ich das <CR> nicht in meinem String haben will.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Ich habe übrigens oben noch mal den Clear Befehl geändert.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    44
    Beiträge
    180
    edit:

    Hallo zusammen,

    nach dem Ansatz von for_ro habe ich noch ein wenig weiter gesucht und eine Funktion gefunden.
    Ich stelle die hier allen zur Verfügung die ein ähnliches Problem haben wie ich:


    Code:
     $regfile = "m8def.dat"
     $crystal = 7372800
     $baud = 9600
    
    
     Dim S As String * 10
     Dim B(11) As Byte At S Overlay
     Dim N As Byte
    
     On Urxc Onrxd
     Enable Urxc
     Enable Interrupts
    
    
    
    Main:
    
       If N > 9 Then
             Print S
             N = 0
             End If
    
       Goto Main
    
    
    
    
    Onrxd:
    Incr N
     B(n) = Udr
    Return
    \/ \/

Berechtigungen

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