Forum: Mikrocontroller und Digitale Elektronik Suche Lösungsansatz zum Senden von Befehlen


von Peter (Gast)


Lesenswert?

Hallo zusammen

Ich kann jetzt über den Uart mittels Interrupt Zeichen senden.
Ich benütze aber nur TxD und RxD.

Wenn ich aber Befehle auf den AVR senden möchte die aus meheren Zeichen
bestehen könnte es Probleme geben.
Ich wenn ich den Befehl gesendet habe ein OK zurück oder ein ERROR.
Also OK wenn befeh Verstanden Error wenn nicht.

Da jedes Zeichen vom Befehl einzel kommen woher weiss ich wann der
Befehl komplett angekommen ist.

Muss ich das mit einem Timer arbeiten?
Dass ich nach einem Bestimmten Timeout den Befehl als gesendet
angschau
und ihn prüfe?

Oder gibt es andere Ansätze oder wie macht ihr das?




MfG

Peter

von Michael (Gast)


Lesenswert?

Ich nehme meistens Start- und Stopbyte und setze im IRQ Flags, die dann
in der Hauptschleife entsprechend ausgewertet werden.
Anstatt Stopbyte benutze ich manchmal auch einen Timeout, der im
Timer-IRQ runtergezählt wird.

von Peter D. (peda)


Lesenswert?

Am einfachsten ist es die Kommandos und Parameter als Text zu senden und
mit "Enter" (0x0A oder 0x0D+0x0A) abzuschließen.

Der Empfänger weiß dann, wenn das "Enter" sieht, daß ein Befehl
komplett ist und kann ihn auswerten.


Peter

von Dirk (Gast)


Lesenswert?

Hi,

du koenntest auch die Daten die gesendet werden als protokoll
aufbauen.

z.B. (Sender) startbit, adresse, command , laenge des Strings,
stopbit.

Mfg

Dirk

von Steffen (Gast)


Lesenswert?

Ich verwende folgendes Protokoll:

- Anzahl Datenbyte (Wieviel Byte kommen noch)
- Adresse (nur bei Bussystem wie RS485)
- Befehlskennung
- Daten
- Checkbyte als XOR aller Daten

Das erste Byte gibt an, wieviel Byte noch kommen, bis der Befehl
komplett ist und mit der Adresse wird zB. bei einem RS485-Bus ein
bestimmtes Slave-System angesprochen.
Die Befehlskennung kennzeichnet den entsprechenden Befehl wie z.B.
"W" für WriteEEPROM. Die Daten werden je nach Befehl gesendet. Zur
Kontrolle der empfangen Daten diehnt das Checkbyte.

Der Empfänger weiss so genau, wann ein Datensatz zu Ende ist ohne erst
einen Timeout zu berücksichtigen. Dieser muss allerdings trotzdem
eingebaut werden, da es ja auch zu Störungen kommen kann. Wird z.B.
eine Störung als 0xFF erkannt würde der Controller ohne Timeout warten,
bis 255 Zeichen empfangen wurden.

Es können alle binären Daten gesendet werden, was bei der Kennzeichnung
durch Start und Stoppbyte nicht möglich ist. Dadurch ist die
Datenübertragung schneller wie im Klartext. Allerdings kann man die
Applikation bei der Variante von Peter schnell mal mit einem
Terminalprogramm testen, was bei meiner Variante nicht möglich ist.

Steffen

von Uwe (Gast)


Lesenswert?

Hi!

Echo des AVR in Verbindung mit Break vom PC bei Fehler wäre noch eine
Variante.

MFG Uwe

von Peter (Gast)


Lesenswert?

Hallo

Danke für die vielen guten Ideen

Gruss

Peter

von Henning (Gast)


Lesenswert?

hab nocheine:
ich schiebe im emfangsinterrupt das in empf zeichen in einen Puffer
(RAM), den ich durchschiebe (4Byte)
 kommt nun ein $0D (return) wird das in der dauerschleife erkannt und
die interpretierung durchgeführt
puffer 1 ist das 2te parameter
puffer 2 ist das 3te parameter
puffer 3 ist das command
puffer 4 ist das Bestätigungszeichen $0D

recht simpel gehalten und läuft bei mir gut. nur es gibt eben kein
checkbyte, was aber auch nicht nötig ist, denn ein $0D als störung is
unwarscheinlich und $0D ist auch niemals als befehlsbyte definiert

von Henning (Gast)


Lesenswert?

puffer 3 ist natrülich der 1ste parameter, sorry

von Jörg Maaßen (Gast)


Lesenswert?

@Henning

und was machst Du, wenn einer Deiner Parameter 0D ist oder du ein Byte
nicht mitbekommst?

Gruß Jörg

von Henning (Gast)


Lesenswert?

auf eine überprüfung, ob alles angekommen ist habe ich (bewust)
verzichtet.
aber an das 0D als parameter habe ich nicht gedacht... danke

das muss ich wohl noch ändern, und darf nicht auf 0d reagieren, wenn
das vorhergehende Byte auch ein 0d war. dann kann ich schonmal alle
werte im Byte nach dem return senden.

hmm, hab versucht das so klein wie möglich zu bekommen. und wenn man
das befehlsbyte nach vorne stellt muss man das schon auswerten und
darauf reagieren, wieviele optionen zu erwarten sind... oder die
befehlslänge immer mitschicken...

wohl doch nicht so einfach, wie ich gedacht hab :)

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.