mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kommunikation PC-µController


Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Au weia Nr. 133087612340458263 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Au weia Nr. 133087612340458265 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Au weia Nr. 133087612340458265 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Au weia Nr. 133087612340458265 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.