PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage an die RS232 Profis



m@rkus33
06.02.2006, 11:17
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:


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.

PicNick
06.02.2006, 12:17
Wenn du "ischar..." verwendest, brauchst du nicht auch noch "Waitkey" machen, da reicht inkey()
Was heißt "then empfang " goto ? gosub ?

m@rkus33
06.02.2006, 12:36
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

PicNick
06.02.2006, 12:42
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..."

m@rkus33
06.02.2006, 13:09
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

PicNick
06.02.2006, 13:45
ah, mit declare. das entspricht gosub
dann hast du aber (möglicherweise) eine Hund drinnen


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.

m@rkus33
06.02.2006, 14:16
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

PicNick
06.02.2006, 14:24
Ich glaub, du hast vor DO..Loop den reset auf D vergessen

m@rkus33
06.02.2006, 14:48
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

PicNick
06.02.2006, 15:07
Nun sieht ok aus. Tu' mir aber einen Gefallen und schreib den Empfang etwas um


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

m@rkus33
06.02.2006, 16:05
Hallo PicNick,

also ich habe den Empfang auch umgeschrieben.

geht leider auch nicht....

Der Empfänger "findet" das Starbyte scheinbar nicht und sortiert die Dabenbytes völlig falsch ein.

Er zeigt mir nur Müll an.

und nun? Ich weis nicht mehr weiter.

Er kommt mit den 10 Bytes vom "Header" scheinbar nicht klar.

Ohne diese geht es wunderbar.

Hast Du noch eine Idee?

Hier der bisherige Code:

Sender:


Dim Ta As Byte
Dim Tv As Long
Dim Eu As Word
Dim B(7) As Byte At Ta Overlay

Dim Stb As Byte
Dim C As Byte
Dim D As Byte
Dim Header(4) As Byte

Header(1) = 255
Header(2) = 0
Header(3) = 3
Header(4) = 15
C = 0
D = 0
Stb = 233

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


Empfänger:


Dim Ta As Byte
Dim Tv As Long
Dim Eu As Word
Dim B(7) As Byte At Ta Overlay
Dim A As Byte
Dim C As Byte
Dim D As Byte

D=0
C=0

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

Loop

'--- Subs---

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

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


Gruß
Markus

PicNick
06.02.2006, 16:16
? Vom Startbyte an mit 233 schickt er ja nur 3 bytes. d.h. die "9" erreichtst du ja nie , der kommt ja nur bis 2 ?