PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zerlegen von empfangenen Daten!?



Douser182
19.02.2008, 21:43
Hey, suche schon eine weile, weiß aber leider nicht nach was ich suchen soll.
Ich will folgendes machen: Controller1 sendet über UART (Txd -> Rxd) einige Daten zu Controller2. Bis jetzt ist es noch ganz einfach. Die Daten werden ca. so aussehen: 0101100 oder so ähnlich! (01 steht für Board, 01 für Servo und 100 für Position, die Werte verändern sich stehtig!)
Wie kann ich die ankommende Nachricht im Controller2 zerlegen?

Danke im Vorraus

PS: Arbeite zur Zeit mit Bascome und da gibt es eine super große Hilfe, aber nach was muss ich suchen?

askazo
20.02.2008, 07:28
Ich kenne mich mit Bascom nicht aus, daher kann ich Dir keine Lösung in Programmform liefern. Ich versuchs zu beschreiben:

Generell geht das ganze mit shiften und ausmaskieren.
um z.B. die oberen 2 Bits zu bekommen, schiebst Du einfach die Daten um 5 Bit nach rechts und fertig.

Um die mittleren 2 Bits zu bekommen, schiebst Du die Daten um 3 Stellen nach rechts. dann erhälst Du aber 0101 - Du musst also noch die oberen 2 Bit ausmaskieren. Das machst Du dann mit einem Bitweisen UND (in C wäre das "& 0b11"

Die unteren 3 Bit muss Du nicht schieben, sondern nur ausmaskieren.

Ich hoffe, das hilft schon mal weiter.

Gruß,
askazo

pongi
20.02.2008, 08:36
Also wenn die Position in den letzten 3 Bits steht, machst du Befehl AND 0b00000111.

Damit werden die ersten 5 Bits des Befehls 0, die letzten 3 bleiben erhalten, und du hast rein die Position, die du dann weiterverarbeiten kannst.

MfG

pongi

Douser182
22.02.2008, 19:03
Verstehe noch nicht ganz, wie ich das in meinen Text einbauen muss!
Kann mir jemand Bascom suchen muss, damit ich ein Beispiel oder so was bekomme*

Douser182
22.02.2008, 19:06
Ach ja und das Beispiel von mir war etwas blöde! Die eingehende Nachricht besteht nicht nur aus 0 und 1, es können alle Zahlen vorkommen! (z.B: 0908056)

Vitis
22.02.2008, 19:22
na prima ... vermutlich sendest du einfech per Print befehl.
wenn das letzte zeichen gesendet wurde schließt du dann hoffentlich mit cr-lf ab,
oder?
dann ists nämlich einfach. Dann kanste die zeichen bis cr empfangen in
einen String schiebem und da legste dir n overlay arra drüber und schon
kannste dir das einzelne Zeichen auslesen. Dann ne einfache Subtraktion
und schon haste den "echten" zahlenwert.

Douser182
22.02.2008, 20:24
OK alles klar, so in der art habe ich mir das auch forgestellt aber mit einfacher Subtraktion haut es nicht hin.
Kannst du mir das in einen kurzen Quelltext packen oder sagen, wo man das nachlesen kann. Bei Bascom finde ich zu overlay irgendwie nicht das richtige

Vitis
23.02.2008, 11:49
is ganz einfach ...

geht sogar ohne Overlay, wenn ichs recht überlege.

aber zu erst mal kleine info zu Overlay.

Man kann

Dim string_variable as string * 20
dim Zeichenarray (20) as byte at string_variable overlay machen
und so jedes einzelne Zeichen als Bytewert im ASCII auslesen.
ganz easy. ... brauchen wir aber in dem Fall dann doch nicht :)

die andere Geschichte geht genauso leicht.

zunächst mal brauchste ne empfangsroutine, die am Besten
als Interrupt ausgeführt wird.
Also On URXC empfangsroutine
dim empfangenes_byte(20) as byte
dim telegrammflag as byte
dim zeiger as byte
zeiger=1

empfangsroutine:
empfangenes_byte(zeiger)=UDR
if empfangenes_byte =13
telegrammflag=1
endif
incr zeiger
return

dann musste nur noch indeiner Mainloop die Verarbeitung einbauen

do
.......

if telegrammflag=1 then
telegrammflag=0
' hier schreibste dann einfach Deine Telegrammverwendung rein.
' Die ASCII im Arra kannste einfach per Substraktion von &H30
' in Zahlen zurückverwandeln
zeiger=1
endif
.......
loop