Forum: Mikrocontroller und Digitale Elektronik Kommunikation PC-µController


von Mr Bean (Gast)


Lesenswert?

Hallo

Ich möchte über RS232 Befehle an meinen Controller (SiLabs F330) senden. 
wie gehe ich hier am besten bei der Umsetzung vor? Die Befehel sollen 
über die Kommandozeile im ASCII Format an den Controller geschickt 
werden.
z.B. <getTemp>
Muss ich die Daten die ich Controllerseitig empfange zuerst in eine 
int-Variable wandeln? Oder wie kann ich die Befehle am einfachsten 
verarbeiten? Bin für jeden Tipp dankbar! Das Senden von daten 
Controller>>PC funktioniert schon. Ich schicke derzeit einfach die 
aktuelle Temperatur an den PC.

MFG

Bean

von Au weia Nr. 133087612340458263 (Gast)


Lesenswert?

> Muss ich die Daten die ich Controllerseitig empfange zuerst in eine
int-Variable wandeln?

Du MUSST gar nix. Du bist der Gott des Systems und kannst mit ihm 
machen, was DU willst. Es hängt alles davon ab, was das Teil tun soll.

> Oder wie kann ich die Befehle am einfachsten verarbeiten?

Tipp: Fang an, den Befehl, so wie er ist, zurückzuschicken. Dann siehst 
Du, ob der Empfang klappt. Danach hänge weitere Verarbeitungsschritte 
dran.

Was Du dazu tun willst, wird Dir dann schon klar werden, wenn Du damit 
rumprobierst.

von Mr Bean (Gast)


Lesenswert?

Erstmal danke für die klasse Antwort... ;-)
Naja vielleicht muss ich meine Frage präzisieren, man soll den Fehler ja 
zuerst bei sich suchen bevor man über andere lästert.
Was mir nicht klar ist, dass wenn ich den Befehl <getTemp> über die 
RS232 schicke für jedes Zeichen 2Byte gesendet werden. Bei "g" z.B. 
0x67.
Jetzt muss ich das in meinem Controller ja irgendwie aus dem Buffer in 
eine Variable schreiben. Wie mache ich das? Und wie sezte ich dann 
nachher den String wieder zusammen?
Hoffe ich bekomme noch ein paar Antworten, die mir noch weiter helfen 
wie die, die bereits gepostet wurde...

Danke!

MFG

Bean

von Au weia Nr. 133087612340458265 (Gast)


Lesenswert?

> für jedes Zeichen 2Byte gesendet werden. Bei "g" z.B. 0x67.

0x67 ist nur ein Byte. Das 0x sagt nur, dass das 67 ein Hexadezimalcode 
ist. Und zwar gerade der Hex-Code für ein kleines g.

Ansonsten musst Du einen String (ein Array aus Zeichen), also eine 
Variable für die Zeichen anlegen, in die Du dann nach und nach die 
empfangenen Zeichen speicherst.

Irgendwie muss dabei das Ende eines Befehls erkannt werden. Wenn Du das 
hast, kannst Du den Befehl mit einer Liste von möglichen Befehlen 
vergleichen und dann entsprechend reagieren.

Das alles ist im Wesentlichen Zeichen- und Stringverarbeitung mit 
geeigneten Vergleichen.

von Mr Bean (Gast)


Lesenswert?

Ah ok, ja stimmt klar. Aber dann muss die Größe des Arrays das ich 
anlege ja dynamisch sein!? Oder reicht es ein Array anzulegen das groß 
genug ist um den größten Befehl aufzunehmen und bei kleineren Befehlen 
wird der Rest dann einfach mit Nullen aufgefüllt...?

Grüße!

Bean

von Au weia Nr. 133087612340458265 (Gast)


Lesenswert?

Du kannst zum Beispiel die Zeichen so lange in eine String-Variable 
speichern, bis der PC die Eingabetaste drückt (Zeichen 0x0D) oder bis 
die Maximallänge der Variable erreicht ist. Das sind jeweils 
if-Vergleiche nach dem Empfang bzw. dem Speichern eines Zeichens.

Wenn eine dieser beiden Bedingungen erreicht ist, sendest Du den ganzen 
String einfach mal zurück (als Kontrolle für Dich, vor allem während der 
Testphase) und verarbeitest den Befehl.

von Au weia Nr. 133087612340458265 (Gast)


Lesenswert?

Wie gesagt, das ist Stringverarbeitung.

Um die Erarbeitung der entsprechenden Abschnitte eines C-Buchs oder 
eines Tutorials kommst Du bei sowas nicht herum. (Falls Du C 
verwendest.)

von gast (Gast)


Lesenswert?

leg dir einen buffer an
die länge ist etwas größer als der längste  string den du sendest
in diesen buffer empfängst du nun die datem vom PC

wenn ein gewisses zeichen kommt .. zB <enter>
schließt den string mit einem '\0' ab und vergleichst den string mit 
einer konstante zB deinem "gettemp"  wenn es übereinstimmt schickst du 
die temp .. ansonst verwirfst du den buffer wieder und setzt 
buffer[0]='\0'

damit is der buffer zwar nie leer aber der sting ist ja nur so lang bis 
das '\0' kommt


so mal als ganz einfache version

von horst (Gast)


Lesenswert?

Fang einfach an:
ein char (z.B. t oder T) als befehl für die Ausgabe der Temperatur
dann ein einzelnes Zeichen für was anderes
dann kannst du dir immer noch die Stringverarbeitung anschauen

von horst (Gast)


Lesenswert?

> Oder reicht es ein Array anzulegen das groß
> genug ist um den größten Befehl aufzunehmen

Solange du überprüfst, ob du innerhalb der Grenzen bist: ja
Wenn du aber immer auf ein zum Abschluss gesendetes Zeichen wartest 
(z.B. line feed) dann hast du bei einem Tippfehler leicht einen längeren 
String.

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.