PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten senden/empfangen



FSTII
14.12.2006, 16:17
Hallo zusammen,

ich beschäftige mich erst seit kurzem mit µC und stehe momentan vor einem kleinen Problem.
Von einem Sensor werden Beschleunigungswerte ausgelesen und anschließend von einem Board auf ein anderes gesendet.
Hier der Code:


Do

X = Getadc(0)
Print " " ; X;
Waitms 10

Y = Getadc(1)
Print " " ; Y;
Waitms 10

Z = Getadc(2)
Print " " ; Z;
Waitms 10



Nun zu meiner Frage: Da ich mit den verschiedenen Beschleunigungswerten weiterarbeiten möchte, müssen diese getrennt voneinander abgelegt werden. Ist das möglich? Habe leider noch nichts gefunden, was mir weiterhilft. Vielleicht steh ich aber auch einfach nur auf dem Schlauch.

Für jede Hilfe wäre ich sehr dankbar.

Matthias

(Ich arbeite mit zwei RN-Mega128Funk-Boards mit EasyRadio ER400Trs-Modul)

FSTII
16.12.2006, 16:45
Nachdem ich heute wieder etliche Stunden vor dem Rechner verbracht habe verzweifle ich langsam. Es muss doch eine Möglichkeit geben die Daten, die ich getrennt voneinander verschicke auch getrennt voneinander auszulesen, oder nicht?
Mit Z = Inkey() werden normalerweise die gesendeten Daten empfangen, dabei kann aber nicht zwischen den einzelnen Daten differenziert werden.

Hat schon einmal jemand etwas in dieser Richtung gemacht und vielleicht ein paar Tipps für mich?

Gruß Matthias

Vitis
16.12.2006, 17:03
sowas haben schon viele gemacht, man nennt sowas ein
Übertragungsprotokoll.
Man nehme ein definiertes Startzeichen, damit der Empfänger
weiß, jawoll, hier gehts los.
Dann die 3 x 2 Byte, dann ein definiertes Stop-Zeichen

FSTII
17.12.2006, 17:15
Da ich mich, wie gesagt, mit dem Programmieren erst seit kurzem beschäftige, muss man so etwas erst einmal wissen. Außerdem ist das EasyRadio-Modul eigentlich eine bequeme Variante der Datenübertragung, da man sich nicht ums Übertagungsprotokoll kümmern muss.
So nun aber wieder zu meinem Problem. Habe im Forum etwas gefunden, wie ich den vom ADC eingelesenen Wert mit nem Startbit versehe und dann auf den zweiten Controller sende.
Hier der Code:


Dim X As String * 5
Dim X_wert As Word


X_wert = Getadc(0)
X = Hex(x_wert)
X = "H" + X

Print ; X


Das funktioniert auch so weit. Den gesendeten Wert kann ich am zweiten Controller wieder als string empfangen, aber das Zurückwandeln funktioniert nicht.
Hatte folgendes überlegt:


Dim X_empfangen As String * 5
Dim Kanal As String * 1
Dim Wert_hex As String * 4
Dim Wert As Word

X_empfangen = Inkey()
Kanal = Left(x_empfangen , 1)
If Kanal = "H" Then
Wert_hex = Right(x_empfangen , 4)
Wert = Hexval(wert)

Print #2 , Wert

End If


Wahrscheinlich funktioniert das alles ganz einfach, man muss nur wissen wie. Und genau deshalb brauch ich noch ein bißchen Unterstützung..

Gruß Matthias

veit
17.12.2006, 20:18
ääääh ich bin nicht so der held aber : warum willst du denn werte als string speichern ????

FSTII
17.12.2006, 20:59
das ist das einzige was ich zum Thema Übertragungsprotokoll gefunden habe, das so aussah als würde es mir weiterhelfen. Dass ich eigentlich nicht mit string arbeiten muss, habe ich mir schon fast gedacht, habe aber auch keine Ahnung wie es sonst gehen soll...

Vitis
17.12.2006, 21:52
das kann man als string machen, warum auch nicht.
beispiel:
x123456y als sendestring, das x definiert den start, y als Ende.
so kann man's machen.
eine andere Variante währe die 9-Bit-Methode.
Man benutzt das neunte Bit um den Start zu definieren, dann evtl.
das erste Byte als Anzahl der zu übertragenden Bytes und schon weiß
der Empfänger was geht.
Oder Beispiel Profibus, Hardware ist ganz normale rs485, nur das
Übertragungsprotokoll macht draus ne Profibusanwendung

FSTII
18.12.2006, 14:15
es ist ja schon einmal gut, dass ich mit dem Sendestring gar nicht so falsch liege. Einen String zu schicken, der am Anfang und am Ende ein gewähltes Zeichen enthält funktioniert ja auch.
Aber wie erkläre ich jetzt meinem Empfänger was das Start-, was das Endzeichen ist und was er mit den Werten dazwischen machen soll?
Das Problem ist ja, dass die gesendeten Daten auf dem Controller als ASCII-Werte ankommen (Inkey()).
Und genau hier komme ich auch nicht weiter...
wie bekomme ich die Werte wieder in einen String, den ich dann mit mid(), left() oder right() auslesen kann....???????
oder bin ich mit meiner Denke mal wieder auf dem Holzweg?

Gruß Matthias

Vitis
18.12.2006, 17:09
Zeichen zu einem String zusammenführen ist keine große Sache.
Die Zeichen werden im ASCII-Format kodiert verschickt.
Jedes Zeichen steht für einen 8 Bit Code (0 bis 255).
Nehmen wir beispielsweise das Zeichen "A" dann weiß
der Fachmann, aha, das Zeichen A hat die Kodierung
Dezimal 65 oder binär 01000001, wenn ich mich nicht
verrechnet hab.
Du empfängst also über die UART einen Zahlenwert, der
für ein bestimmtes Zeichen steht. Welches Zeichen
für was das dindeste leicht per Suchmaschine im Netz
unter dem Stichwort ASCII.
Dann gibts noch die Stringfunktionen von Bascom
für das aneinanderreihen.
Zunächst mal kann man den Zahlenwert ins Stringformat
bringen per Befehl chr(x), wobei x für den Zahlenwert
steht. Also
string=chr(zahlenwert 0-255)
dann das aneinanderreihen
per
string2=string2+string und schon werden die Zeichen
aufgereiht.

FSTII
18.12.2006, 17:58
soweit habe ich das verstanden. Allerdings sende ich z.b. X350 (X für X-Wert und 350 der eingelesene Wert), also kommt auf der Empfängerseite der ASCII-Code 88(=X) 51(=3) 53(=5) 48(=0).
Mit chr() erhalte ich dann auch wieder X350. Das Problem ist nur, dass ich eigentlich festlegen will, wenn die erste stelle ein X ist, verarbeite die folgende 350 weiter, wenn die erste Stelle ein Y ist, verarbeite den folgenden Wert weiter...
Müsste ja eigentlich mit den Funktionen left(), mid() funktionieren. Tut es aber nicht, da chr() mein X350 als string*1 speichert..
Hoffe man versteht wo mein Problem liegt.

Gruß Matthias

veit
18.12.2006, 18:44
ne versteh ich nicht.
und da mit irgendwelchen strings und asciis rumzumachen versteh ich auch nicht.

erklär doch mal bitte in welcher form der sensor daten schickt. als byte? also werte zwischen 0 und 255 ? oder mehr? oder weniger?

FSTII
18.12.2006, 18:56
Vom Sensor bekomm ich die Daten als word, sind werte wie z.B. 350....wenn ich die dann an den zweiten Controller schicke, empfängt dieser die 350 als ASCII (515348).
Mein Problem ist aber, dass ich drei verschieden Werte vom Sensor bekomme (x-Richtung, y-Richtung und z-Richtung). Jetzt muss der Empfänger natürlich wissen, welcher Wert für x steht, welcher für y..., sonst kann ich nichts damit anfangen. Deshalb werden die Werte vor dem Versenden mit einem Buchstaben gekennzeichnet. Das funktioniert ja auch, aber ich bekomme sie am Empfänger halt nicht wieder auseinander....

Tom K
22.12.2006, 12:38
Mach mal

Sender: Hallo empfänger
Empfänger: servus sender kann los gehen

sender: ok geht los Word1; word2; word3;..... hast dus
Empfänger: alles empfangen warte auf was neues tschau

Vitis
23.12.2006, 14:04
nunja, nach x und y abfragen ist keine kunst,
wenn zeichen = "x" dann alle nachfolgenden Zeichen sollen
X-Werte sein.
Den ASCII in die Zahl wieder zurückverwandeln ist an sich ne einfache Sache.
Du speicherst die Zahlen der Reihe nach z.B. in einen String.

String=string+chr(zeichen)
So werden die aneinander gereiht.
Nun musste nurnoch rausfinden wie lang dein string ist,
dafür gibts ne Funktion namens Len(String)
z.B. für 350 währ dann len 3.
dann holste Dir per left und right die einzelnen zeichen und wandelst
die in ASCII um, also der reihe nach 51, 53, 48
Dann gehste hin und ziehst von jedem ASCII-Wert 48 ab:
51-48=3
53-48=5
48-48=0
Nun wirds knifflig. Die jeweiligen Werte musste mit der Zehnerpotenz der Stelle von hinten her multiplizieren und die addieren:
also (0 * 10^0) + (5*10^1) + (3 * 10^2) =350 als Dezimalwert.

Ich weiß, der Ablauf ist insgesamt von hinten durchs Knie und umständlich,
mit Overlayvars und Rinpuffer gings schöner, aber ich find so ists für nen
Anfänger vermutlich einfacher und übersichtlicher zu verstehen wie ein Protokoll in den
Grundzügen laufen kann.

Tom K
23.12.2006, 16:43
probiers mal anders

nimste ne case her und schickst diese

wenn zeichen = "Y" dann a=1
wenn zeichen = "Z" dann a=2

das a schickste mit denn anderen words dann weg und mit case a wertest es wieder aus wie dus brauchst

FSTII
29.12.2006, 16:25
Hallo zusammen,
entschuldigung dass ich mich erst so spät wieder melde, aber die Feiertage...

Habe mittlerweile folgenden Code zum Empfangen und Trennen der Daten gebastelt:


Daten = Waitkey()
If Daten = "x" Then
X_1 = Waitkey()
X_2 = Waitkey()
X_3 = Waitkey()
X = X_1 + X_2 + X_3

Damit funktioniert es auch in etwa. Das Problem ist aber, dass die beiden Controller nach kurzer Zeit hängen bleiben.
Da von beiden Controller Werte gesendet und wie oben beschrieben empfangen werden, liegt das Problem wahrscheinlich darin, dass sich die Schleifen überlagern und beide Controller auf empfangene Daten warten. Kann das sein? Was kann man dagegen machen?

Gruß Matthias