- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Frage an die RS232 Profis

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161

    Frage an die RS232 Profis

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich übertrage einen Datensatz bestehend aus Startbyte, 7 Datenbytes, Checksum über RS232. Funktioniert alles bestens.

    Nun möchte ich Vor dem Startbyte aber noch 10 einzelne Bytes als "Header" laufen lassen.

    Die ersten 10Bytes dienen nur als Zeitgewinn und sollen nicht ausgewertet werden.
    Ich arbeite testweise mit Funkstrecke und die Empfängerhardware braucht ein bischen Zeit. Die ersten Bytes kommen meist verstümmelt an. Deshalb die "Headerbytes" um sicher zu gehen, das das Starbyte an 11 Stelle richtig ankommt.

    Wie kann ich in Bascom dem Teil beibringen das er nach dem 10 Byte schauen muss, Das Starbyte(233) vergleichen ob es stimmt und ab da erst die ganze Auswerterei beginnt?
    Ich mache das beim Empfänger bisher so:
    Code:
    Dim T As Byte
    Dim U As Long
    Dim V As Word
    Dim B(7) As Byte At T Overlay
    Dim A As Byte
    Dim C As Byte
    Dim D As Byte
    
    ....
    
    Do
       If Ischarwaiting() = 1 Then Empfang 
       If D = 9 Then Auswertung
    
    .....
    
    Loop
    
    
    Empfang:
    A = Waitkey()
       If D > 0 Then Empfang2
       If A = 233 Then Incr D
       Return
    
    Empfang2:
       If D < 8 Then B(d) = A
       C = C Xor A
        Incr D
        Return
    
    Auswertung:
     If C <> 0 Then
       D = 0
       C = 0
       Return
       End If
    
    '---Auswertung der Daten T,U,V----
    EDIT : Codetags gespendet -- PicNick


    Hat jemand einen Tip? Stehe irgendwei voll auf der Leitung...

    Ach, und mit INPUTBIN und IF B(11) = 233 then ....bla bla kann ich nicht arbeiten - das blockiert mir den rest des Programms. Hab ich schon ausprobiert - geht nicht.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wenn du "ischar..." verwendest, brauchst du nicht auch noch "Waitkey" machen, da reicht inkey()
    Was heißt "then empfang " goto ? gosub ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    then empfang ist der Sprung in die Sub "Empfang"

    brauche da kein gosub oder goto ist ja keine weitere Bedingung in der If-then, oder? Es funktioniert zumindestens auch so wunderbar.

    Ja aber wie mache ich dann nach inkey() weiter? Waitkey() und inkey() reagiert doch nur auf das erste zeichen im Buffer.

    Momentan ist das erste Zeichen ja mein Startbyte (233). Er soll aber nach dem Starbyte im 11 Byte suchen wenn ein Header mit 10 Bytes vorneweg ist. Der aber ignoriert werden soll.

    Gruß
    Markus

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Also bei mir weigert sich der Bascom, wenn er nicht weiß, ob gosub oder goto.
    Startbyte:
    Solange D=0, bist du auf der Jagd nach 233, egal, ob da 3 oder 15 oder 11 Byte kommen. Das sind ja padding-chars für die Synchronisation, sowas zählt man nicht.
    Nach ischarwaiting() = 1 liest du genau ein Zeichen, dann gehst du wieder zurück bis zum nachsten "ischar..."
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    wg. den Subs die habe ich natürlich schon mit "Declare" definiert. Dachach machts aber mein Bascom ohne Goto/Gosub wenn nur die eine Bedingung bei IF - Then drin ist. Geht komischerweise astrein. ?!?

    Habe ich dann das richtig verstanden, dass ich eigentlich gar nix machen brauch? Egal vieviele Bytes vor dem Startbyte kommen? Ischar... fragt jedes EINZELNE Byte im Buffer ab. Wenn dann 233 daherkommt - Ah da is es - und der Empfang und Auswertung läuft.

    Inkey() muss aber dann logischerweise rein, richtig? Mit Watikey() funktioniert das dann so nicht, oder?



    Gruß
    Markus

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    ah, mit declare. das entspricht gosub
    dann hast du aber (möglicherweise) eine Hund drinnen
    Code:
    Empfang: 
    A = Waitkey() 
       If D > 0 Then Empfang2   ; wenn das eine decl.Sub ist, 
                                             ; kommt er auch wieder hier zurück
       If A = 233 Then Incr D 
                                             ; wenn also das A mittendrin nochmal 233 
                                             ; drin hat, macht er zusätzlich incr D 
                                             ; das ist pfui, wenn deine Daten ev. binär sind
    wenn ischarwait..() , sagt, daß ein Zeichen da ist, dann kann man ihm das auch glauben. also brauch ich nicht warten. also einfach inkey()
    Natürlich wartet daher der Waitkey() auch nicht wirklich, schad' also nix.
    Aber in 2-3 monaten wirst du dein eigenes Programm lesen und glauben, es bleib da stehen. sollte man nicht tun.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    Hmm... es funktioniert so nicht..

    Ich sende die Daten binär...

    Er findet den Anfang mit den Startbyte nicht mehr.

    Ich habe Waitkey() durch Inkey() ersetzt. Dumm ist nur, das er jetzt das Startbyte nicht mehr findet und mir nur noch Datenverhau anzeigt.

    Der Sender gibt folgendes raus:

    C = 0
    D = 0
    Stb = 233

    For D = 1 To 7
    C = C Xor B(d)
    Next
    Printbin Header(1) , 5 ; Header(1) , 5 ; Stb ; B(1) ; C


    Empfänger sieht nun so aus:

    Do
    If Ischarwaiting() = 1 Then Empfang
    If D = 9 Then Auswertung
    Loop

    '---Subs--------
    Empfang:
    A = inkey()
    If D > 0 Then Empfang2
    If A = 233 Then Incr D
    Return

    Empfang2:
    If D < 8 Then B(d) = A
    C = C Xor A
    Incr D
    Return

    Auswertung:
    If C <> 0 Then
    D = 0
    C = 0
    Return
    End If

    'Daten werden hier ausgewertet----

    D=0
    C=0
    Retrurn

    Wie löse ich nun das Problem? Ich hab echt keine Idee...

    Muss doch irgenwie gehen. Die ersten 10 Bytes ignorieren, Einsprung im Startbyte (das 11. Byte) , Auswertung des darauffolgenden Arrays (7 Datenbytes), Checksum prüfen. Wie kann ich das Starbyte noch anders definieren da die Zahl 233 nochmal vorkommen kann.

    Gruß
    Markus

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich glaub, du hast vor DO..Loop den reset auf D vergessen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2005
    Beiträge
    161
    Ich habe im richtigen Code den Reset von D und C auf =0 vor der DO LOOP drin.

    Ist das überhaupt der richtige Ansatz für mein Problem, oder muss ich hier einen ganz anderen Weg gehen?

    Gruß
    Markus

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Nun sieht ok aus. Tu' mir aber einen Gefallen und schreib den Empfang etwas um
    Code:
    Empfang: 
    A = inkey() 
    If D > 0 Then 
                   If D < 8 Then B(d) = A 
                   C = C Xor A 
                   Incr D 
    ELSE
            If A = 233 Then Incr D 
    END IF
    Return
    Denn irgendwann gibt's sonst ein Problem
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test