- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: Mehrere Datenpakete in verschiedene Variablen speichern?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.04.2005
    Ort
    Pforzheim
    Alter
    43
    Beiträge
    163

    Mehrere Datenpakete in verschiedene Variablen speichern?

    Anzeige

    E-Bike
    Hallo Leute,

    ich bin zZ an einem Projekt, bei dem ich Daten vom Rechner zum Controller schicken will.

    Ich will jetzt zB die Zahl 2378 an den Controller senden, dieser soll die Zahl dann als 2,378 sek interpretieren.

    Das senden und empfangen funktioniert soweit, aber der Controller "sieht" nur die "8" und speichert mir auch nur die acht in einer Variablen alles andere was davor kam überschreibt er einfach.

    Wie kann ich die ganze Zahl abspeichern, bzw jede Zahl in einer extra Variablen (also 2in die Variable "a", 3 in "b", 7 in "c" und die 8 in "d").

    Anbei mein jetziger Code:

    Code:
    $regfile = "m32def.dat"
    $crystal = 4000000
    $baud = 9600                                                ' use baud rate
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    '####Initialisierung############################################################
    
    Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.4 , Db6 = Porta.5 , Db7 = Porta.6 , E = Porta.2 , Rs = Porta.1
    Config Lcd = 16 * 2
    
    Initlcd                                                     'LCD initialisieren
    Cursor On Blink                                             'Cursor an blinkend
    
    Dim I As Byte
    Dim K As Byte
    
    Config Servos = 1 , Servo1 = Portb.0 , Reload = 10          'Servo-Funktion von Bascom konfigurieren
    On Urxc Onrxd                                               'Interrupt-Routine setzen
    
    
    Cls
    Locate 1 , 1
    Lcd "Warte auf"
    Locate 2 , 1
    Lcd "LabView..."
    
    '####StartHP####################
    Startt:
       Do
          Enable Urxc                                           'Interrupt URXC einschalten
          Enable Interrupts                                     'Interrupts global zulassen
       Loop
    
    
    '####Lesen Interrupt wurde ausgelöst####
    
    Onrxd:
       I = Udr                                                  'Byte aus der UART lesen und in I ablegen
    
          Enable Urxc
          Enable Interrupts
    
       '####Empfangenes Byte#####################
    
            Cls
                Locate 1 , 1
                Lcd "Empfangen:"
                Locate 2 , 1
                Lcd I
    
                Waitms 500
    
            Gosub Startt
    
    End
    Achja, ich er speichert mir die Zahlen im ASCII Format (Also anstatt der "0" die "48")
    MfG Ich

    -------------------------------------------------------------
    http://www.lorenzschulz.de/Roboter.html

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Auweia.
    1. Entferne bitte sofort das "waitms" und das "Gosub" aus der Interrupt-Routine, bevor es jemand sieht und ihn der Schlag trifft.

    2. DEr Datenverkehr über die UART geht byte-weise, und du willst offenbar 4 Byte übertragen.
    Also mußt du wohl auch erstmal 4 Byte empfangen, bis deine "2378" komplett und zum Herzeigen sind.

    Schau mal rein:
    https://www.roboternetz.de/wissen/in...com_UART_Input
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.04.2005
    Ort
    Pforzheim
    Alter
    43
    Beiträge
    163
    Stimmt, hast recht, das gosub brauche ichgarnicht wegen des aktiven Interrupts (oder?).

    Und das waitms ist auch überflüssig.....

    Hoffentlich wurde keiner verletzt

    Ich schau mir mal die Seite an.

    Danke für die Rasche antwort...
    MfG Ich

    -------------------------------------------------------------
    http://www.lorenzschulz.de/Roboter.html

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo,
    ich habe das etwa so gemacht:
    Config Serialin = Buffered , Size = 20, Bytematch=13 '(oder10?) warten bis RETURN empfangen
    .
    .
    .
    Serial0CharMatch:
    while IsCharWaiting()
    'Einsammeln der character, z.B. mit Inkey() und dann weiterverarbeiten
    wend
    return

    Wenn du es ganz sauber machen willst, setzt du in der Interrupt Routine nur ein Flag und machst dann das Einlesen mit der While-Schleife im Hauptprogramm

    Gruß

    Rolf

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zur Info:
    "IsCharWaiting() rechnet aus den Variablen von "Config serialin=" aus, ob Zeichen da sind. Einen Extra-Flag muß man eigentlich nicht machen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Ich denke, Serial0CharMatch ist eine Interruptroutine und streng nach dem Motto "Interrupt Routine so kurz wie möglich" wird das Einlesen und Verarbeiten nicht mehr in der Routine selbst gemacht. Ist doch auch nicht nötig, geht im HP genauso.
    Wenn die Anzahl der Befehle, die über SerialIn kommen, steigt, wird auch die Verarbeitung aufwändiger. Dann möchte ich erst damit anfangen, wenn ich weiß, dass der Befehl komplett ist, bei mir ein RETURN am Ende. Dass kann ich so ganz gut steuern.

    Gruß

    Rolf

Berechtigungen

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

Solar Speicher und Akkus Tests