Bascom Programm bleibt beim Empfang stehen (Steuerzeichen)

MarcE

Neues Mitglied
27. Mai 2010
2
0
0
Sprachen
  1. BascomAVR
Servus Forumsgemeinde!

Habe endlich mal wieder meine Elektronik-Bastelleien ausgekramt. Zur Zeit vezweifele ich ein wenig an der Steuerung von Ausgängen via UART.
Es gibt von "gerold" im Lötstelle-Forum ein nett gemachtes Program (Thread-Link), das mir vom Aufbau sehr gefällt Einfache Steuerbefehle, die mit einem Steuerbefehl abgeschlossen werden. Im original mit einem CARRIAGE RETURN (ASCII-13 ). Mit dem AVR-Terminal war mir das zu umständlich und habe daher das Sterzeichen gegen ein "!" (33) ausgetauscht.
Das Programm ignoriert was auf der UART passiert, bis das das "!" empfangen wird und genau dann bleibt es stehen. Jetzt frage ich mich, wo da der Fehler ist.

Die Hauptschleife sieht so aus:
Code:
'Prozeduren
Declare Sub Serial0charmatch()
Declare Sub Do_get_command(cmd_output As String)
Declare Sub Do_set_command(cmd_output As String , Cmd_status As String)
Declare Sub Do_all_command(cmd_status As String)

'UART-Buffer
Config Serialin = Buffered , Size = 15 , Bytematch = 33
Enable Interrupts


Do
   If New_command <> "" Then
      'Alles in Großbuchstaben umwandeln
      New_command = Ucase(new_command)

      'Anweisung aufteilen
      Tmp = Split(new_command , Command_array(1) , " ")

      Select Case Command_array(1)
      Case "GET"
         'Status des Ausganges/der Ausgänge zurück geben
         Call Do_get_command(command_array(2))
      Case "SET"
         'Stellt einen oder alle Ausgänge ein
         Call Do_set_command(command_array(2) , Command_array(3))
      Case "ALL"
         'Stellt alle Ausgänge ein
         Call Do_all_command(command_array(2))
      Case Else
         Print "ERROR: unknown command"
      End Select

      New_command = ""
   End If
Loop

End

'Wird automatisch ausgeführt, wenn CARRIAGE RETURN empfangen wird.
Sub Serial0charmatch()
   Input New_command Noecho
End Sub

Was ich mich als erstes schon mal frage ist, wer "sagt" den der Sub "Serial0charmatch()" das sie angesprungen werden soll?

Hoffe ihr könnt mir weiter helfen und danke für eure Antworten schonmal im Voraus.

Gruß
MarcE
 
Was ich mich als erstes schon mal frage ist, wer "sagt" den der Sub "Serial0charmatch()" das sie angesprungen werden soll?
Hallo MarcE,
das macht die Routine, die der Compiler aufgrund deines Config SerialIn in deinen Code einfügt.

Durch die Änderung auf ! hast du die Idee ausgetrickst. Wenn auf ein CR gewartet wird, dann funktioniert der Input Befehl, der nämlich auch auf ein CR wartet und dann alles eingelesene in die Variable übergibt. Kommt kein CR, dann wartet Input für immer.
 
Servus!

Danke für Deine Antwort! Ich bin davon ausgegangen, wenn ich
Code:
Config Serialin = Buffered , Size = 15 , Bytematch = 33
entsprechend meinen Bedürfnissen anpasse, das das auch so geht, weil der Mc ja sonst alles ignoriert hat, aber nach dem Empfang eines "!" stehen bleibt.
Ebenso war ich der Annahme, ich hätte das mit CR / 13 getestet und über das AVR Terminal die reinen HEX-Werte (mit abschließenden CR/13) gesendet. War wohl ein Fehler, denn eben habe ich es getestet und siehe da, Programm funktionert! :banghead:

Jetzt aber die Frage: wenn ich doch schon es die Option "Bytematch = 33" gibt, warum darf ich die nicht verändern? Kann man das doch gleich weglassen...

edit:
Noch etwas: ich habe ja hier:
Code:
 'Ausgang/Ausgänge einstellen
   Select Case Cmd_output
   Case "ALL"
      Output_1 = New_status
      Output_2 = New_status
      Output_3 = New_status
      Output_4 = New_status
      Output_5 = New_status
   Case "1"
      Output_1 = New_status
   Case "2"
      Output_2 = New_status
   Case "3"
      Output_3 = New_status
   Case "4"
      Output_4 = New_status
   Case "5"
      Output_5 = New_status
   Case Else
      Print "ERROR: unknown output pin"
      Exit Sub
   End Select
   Print "OK"
End Sub
Meine "Schalter" zum ein/aus-schalten. Wie kriege ich es denn am einfachsten hin, das der Ausgang nur solange "ON" bleibt, wie auf der UART auch der entsprechende Befehl anliegt?
 
Jetzt aber die Frage: wenn ich doch schon es die Option "Bytematch = 33" gibt, warum darf ich die nicht verändern? Kann man das doch gleich weglassen...
Es gibt noch viele andere Möglichkeiten, anstelle des Input-Befehls Daten vom UART einzulesen. Input kannst du jedenfals nur verwenden, wenn am Ende ein CR oder LF steht (siehe auch Config Input).
In der Hilfe zu Config SerialIn steht übrigens auch, dass alle eingelesenen Bytes schon in einem Buffer (_RS232INBUF0) stehen. Den kannst du auch auslesen.
Beachte auch das rote und gelbe Ausrufezeichen etwas weiter unten in der Hilfe!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)