Forum: Mikrocontroller und Digitale Elektronik Uart-Verbindung über USB


von Clemens (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei mit einem Atmel 89C5131 drei Modellbauservos für 
ein Schulprojekt anzusteuern. Die Positionsdaten lese ich von einem 
Xbox360-Controller aus und schicke sie als char-array über eine 
USB-Uart-Verbindung zum Microcontroller. Mit einem Wert funktioniert das 
alles bereits bestens.

Nun zu meinem Problem:

Wie kann ich am besten mehrere werte gleichzeitig in einem String 
verschicken und im µC wieder aufsplitten?

Ich habe es schon versucht, die werte mit punkten o.ä. zu trennen, doch 
das ging nicht so wie ich wollte.

die einfachste möglichkeit wäre es, zb. die ersten 3 stellen für den 
ersten wert, dann die nächsten 3 stellen der nächste wert und so 
weiter...

mit welchen standart c-funktionen kann ich am einfachsten einen 
char-array abschneiden? (von vorne und hinten)

Ich würde mich über eine schnelle Antwort freuen, da ich bis Donnerstag 
fertig sein muss... (=

MFG
Clemens

von Oliver J. (skriptkiddy)


Lesenswert?

strtok könnte was für dich sein

von Andreas B. (andreasb)


Lesenswert?

Was heisst Char Array? Binär? Oder ASCII?

Du must bedenken, der Punkt (ASCII) hat den Wert 46, also du kannst 
nicht unterscheiden ob du 46 oder den Punkt sendest.


Am einfachsten Machst du einen Definierten Anfang, also du sendest z.B. 
ein 'A', danach empfängst du deine X Bytes und dann bist du wider im 
Anfangszustand.

Wenn du etwas anderes als ein 'A' kriegst ist etwas schief gelaufen.

Wenn du noch etwas anderes senden willst sendest du einfach ein 'B' usw.


Also du sendest einfach einen Anfang, und dann ist auch klar wie viel 
Daten das du nachher erhaltest, und dann erwartest du dein nächstes 
Paket.

Es gibt noch diverse andere Ansätze, aber solange du nicht verratest was 
du mit den Daten machst kann ich nur raten.


[edit]Aja, und wenn du Zeichenweise empfängst einfach ein 'if', sonst 
eben strtok wie von Oliver genannt


mfg Andreas

von Stefan (Gast)


Lesenswert?

Hallo,

ich rate dir zum CSV- Format (Comma Separated Values) und auftrennen mit 
strtok. Stringende mit CR.

D.h. du sendest/liest immer einen ganzen String bis zum CR und tennst in 
dann mit strtok auf

von Achim M. (minifloat)


Lesenswert?

Clemens schrieb:
> und schicke sie als char-array über eine
> USB-Uart-Verbindung zum Microcontroller. Mit einem Wert funktioniert das
> alles bereits bestens.

Du brauchst sowas wie ein Protokoll, hier mal ein paar Beispiele mit der 
Annahme, dass du Werte von 0-255(0x00 bis 0xff) versenden willst

Das hier...
0x01 --  ID Servo 1
'0'  --  oberes nibble der sollposition in hex
'a'  -- unteres nibble der sollposition in hex
...hieße z.B. "stelle Servo 1 auf Position 10"

oder das hier...
0x02
'3'
'c'
0x00
'7'
'f'
...hieße dann "stelle servo 2 auf 60; stelle servo 0 auf Mittelstellung"

Das ließe sich mit einer Statemachine im RX-Interrupt ziemlich einfach 
aufdröseln. Alles was an Zeichen nicht passt, wird weggeworfen und evtl. 
eine "Fehler - bitte nochmal"-Meldung an den Rechner zurückgeschickt.
mfg mf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.