Wenn du "ischar..." verwendest, brauchst du nicht auch noch "Waitkey" machen, da reicht inkey()
Was heißt "then empfang " goto ? gosub ?
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:
EDIT : Codetags gespendet -- PicNickCode: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----
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.
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.
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
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.
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
ah, mit declare. das entspricht gosub
dann hast du aber (möglicherweise) eine Hund drinnen
wenn ischarwait..() , sagt, daß ein Zeichen da ist, dann kann man ihm das auch glauben. also brauch ich nicht warten. also einfach inkey()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
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.
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
Ich glaub, du hast vor DO..Loop den reset auf D vergessen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
Nun sieht ok aus. Tu' mir aber einen Gefallen und schreib den Empfang etwas um
Denn irgendwann gibt's sonst ein ProblemCode: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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen