-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Anfänger Fragen: inkey, waitkey oder Ischarwaiting verwenden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Beiträge
    33

    Anfänger Fragen: inkey, waitkey oder Ischarwaiting verwenden

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

    mache über die RS232 eine Abfrage die dann beim richtigen Input demenstsprechend Antworten soll. Nur leider klappt es nicht so wie ich will.

    Hier der Code:
    Code:
    'Hardware:  MAX232 an PD0/PD1, Nullmodemkabel zum PC
    '---------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 3686400                                          'Quarz: 3.6864 MHz
    $baud = 9600                                                'Baudrate der UART: 9600 Baud
    Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    ' set buffer for hardware UART input
    Config Serialin = Buffered , Size = 254
    Enable Interrupts
    
    Dim A As Byte
    Dim B As String * 7
    
    
    Anfang:
    
    B = Chr(&H00) + Chr(&H05) + Chr(&H08) + Chr(&H7d) + Chr(&H00) + Chr(&H70) + Chr(&H00)
    
    A = Ischarwaiting()
       If A = B Then
       Goto Klappen:
       Else
       Goto Anfang:
       End If
    
    Gosub Anfang:
    Klappen:
    
    Waitms 200
    Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H01 ; &H39 ; &H01 ; &H0C ;
    Waitms 200
    Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H02 ; &H39 ; &H01 ; &H0F ;
    Goto Anfang:
    
    
    
    End
    Hab nur jetzt leider bei inkey und waitkey das Problem, das sobald ein Zeichen der chr( )-Kette empfangen wird gleich das ganze Programm druchläuft und quasi gleich zu "klappen:" geht.
    Soll natürlich warten bis der komplette richtige Code erst empfangen wird.
    Bei Ischarwaiting() passiert ganrnix.

    Muß ich die Zeichen irgendwie anders abfragen oder verketten ?

    Goto verwende ich jetzt schon weil die Abfrage noch erweitert werden soll...

    Vielen Dank im voraus !!!

    M.f.G.
    Jürgen

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.01.2006
    Ort
    Kirchdorf a. Inn
    Alter
    46
    Beiträge
    81
    Hallo Jürgen75,

    meine Version ist wahrscheinlich nicht die feine Art aber funktioniert.
    Ich frag die Zeichen ab und wenn nach Empfang eines Zeichens eine gewisse Zeit kein neues Zeichen empfangen wird, gehe ich davon aus, dass der gesamte Befehl per RS232 empfangen worden ist.
    Nach Auslösen der darauf folgenden Aktion des µC lösche ich den Befehl wieder und warte auf neue Instruktionen.

    Trotzdem auch von meiner Seite: Sollte eigentlich einfacher gehen, oder?

    gruss,
    wassermann

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Da liegt ein mißverständnis vor
    "ISCHARWAITING()" liefert "0", wenn nix da ist, und "1", wenn eins oder mehrere Zeichen da sind. Die Daten mußt du dir schon selber holen. Und beim UART mußt du sie auch selber zusammensetzen, also hintereinanderhängen.
    in etwa so, wenn z.B. genau 7 Zeichen erwartet werden:
    Code:
    dim buffer(10) as byte
    dim bufferindex as byte
    
    
      Bufferindex = 1        ' Index an den Anfang
    
      IF IsCharWaiting() <> 0 then 
          Buffer(Bufferindex) = INKEY()
          incr Bufferindex 
          IF Bufferindex > 7 then
    '------------- Alle Datenfelder komplett, jetzt verarbeiten ----------------
             Bufferindex = 1        ' Index zurücksetzen
          End If
       End If
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Beiträge
    33
    Ahhh, achso. Ich muß quasi mein "input" erst kombinieren und dann mit meinem Code vergleichen.

    Ich schau mir erst in ruhe die einzelnen Schritte und Befehle an. Hab zwar die Logik verstanden aber nicht genau den Ablauf.

    Vielen Dank !!


    Das wird bestimmt noch lustig wenn ich noch mehr solcher Abfragen mit verschiedenen Längen hinzufügen möchte.


    @wassermann : nur ein Zeichen abfragen ist bei mir leider zu wenig. Brauch genau die Reihenfolge...

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    ..mehr solcher Abfragen mit verschiedenen Längen ..
    Na, da macht man aber schon eine SUB mit der Länge als Parameter
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.01.2006
    Ort
    Kirchdorf a. Inn
    Alter
    46
    Beiträge
    81
    @Jürgen75

    die Befehle, die vom PC kommen, sind nicht nur 1 Zeichen lang. Es ist so wie es PicNick beschrieben hat. Sie können unterschiedlich lang und verschieden aufgebaut sein. Die jeweilige Reaktion (je nachdem was in buffer(10) drin steht) machst du ja dann im µC.

    gruss,
    wassermann

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Beiträge
    33
    also so funktioniert mein neuer Code nicht:

    Code:
    ' set buffer for hardware UART input
    Config Serialin = Buffered , Size = 254
    Enable Interrupts
    
    Dim A As Byte
    Dim B As String * 7
    dim buffer(10) as byte
    Dim Bufferindex As Byte
    
    
    
    B = Chr(&H00) + Chr(&H05) + Chr(&H08) + Chr(&H7d) + Chr(&H00) + Chr(&H70) + Chr(&H00)
    
    Anfang:
    Bufferindex = 1
       If Ischarwaiting() <> 0 Then
          Buffer(Bufferindex) = INKEY()
          incr Bufferindex
          If Bufferindex > 7 Then
          Goto Abfrage:
          End If
       End If
    
    Abfrage:
      If Buffer(bufferindex) = B Then
      Goto Klappen:
      Else
      Goto Anfang:
      End If
    
    
    Klappen:
    
    Waitms 200
    Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H01 ; &H39 ; &H01 ; &H0C ;
    Waitms 200
    Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H02 ; &H39 ; &H01 ; &H0F ;
    
    Bufferindex = 1                                             ' Index zurücksetzen
    
    Goto Anfang:
    
    
    
    End
    jetzt läuft das Programm komplett durch wenn anscheinend ein Code darin vorkommt. Aber es soll ja erst so sein wenn die ganze Abfrage in der Reihenfolge in dem Codewirwar vorkommt.

    Was mach ich falsch ?

    Merci !

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Beiträge
    33
    na, weiß keiner was ?

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.08.2004
    Beiträge
    197
    Brauchst doch nur im Simulator simulieren, du gehst auf jeden Fall zur Abfrage weil du nach endif nicht in ein Hauptprogramm zurück springst !!

    Du solltest in der Hilfe mal unter ON INTERRUPT, spez URX schauen,
    Du brauchst ein Unterprogram on interupt (urx) welches mit Return beendet wird.
    Der Code ist nicht so schlecht, nur nicht fertig.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    19.06.2007
    Beiträge
    33
    Hi,

    ich schnall es nicht.
    Brauch ich das OnRxD wenn ich über Ischarwaiting abfrage ?
    So wie ich das versteh läuft das dann im Hintergrund und es geht keine Abfrage verloren oder ?

    Wenn ich mit dem AVR Terminal simuliere läuft das komplette Programm durch sobald ich &h05 (also den 2ten code) eingebe
    Egal welchen code ich vorgebe, immer wenn der 2te Code zum testen eigegeben wird läuft es durch...

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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