Er kann die Geschwindigkeiten:
4800
9600
19200
38400
verwenden. Diese haben alle einen Fehler von 0,16% bei 16Mhz. Ich denke damit kann man Leben.
Jetzt müsste man nurnoch wissen, wie lang eine Übertragung ist.
Er kann die Geschwindigkeiten:
4800
9600
19200
38400
verwenden. Diese haben alle einen Fehler von 0,16% bei 16Mhz. Ich denke damit kann man Leben.
Jetzt müsste man nurnoch wissen, wie lang eine Übertragung ist.
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Ja, das dacht ich auch schon mal ... "Ach was mit dem kleinen Fehler kann man leben ..."
Hab da auch schon Lehrgeld bezahlt
Bei der Länge, die er alle 100ms rüber schieben will plus der Umwandlung der Strings in Integer ... sportlich.
Das puffernd im Ringpuffer würd ich bleiben lassen und direkt "inline" umwandeln, sprich immer wenn ein Abschnitt komplett ist direkt.
Ginge recht einfach ... per uart-interrupt Zeichen einlesen.
Wenn ist Trennzeichen Pointer zurücksetzen, dann die nachfolgenden Zeichen in Puffer, beim nächsten
Trennzeichen den Puffer kopieren, Parametercounter erhöhen,
die Kopie umrechnen lassen und Ergebnis in Array mit Stelle des Parameterzählers speichern.
Am Ende der Zeichenfolge dann ein End-Zeichen um den Parameterzähler zurückzusetzen (CR-LF z.B.)
Der Haken dabei ist halt, für nen Integer kanns dann mal locker 5 Zeichen werden um 2 Bytes zu übertragen.
Bei sagen wir mal 20 Parametern die er übertragen möchte sind das dann 100 Zeichen plus 20 Trenner, also 120 Zeichen.
8 Bit, plus Start, plus Stopbit sind dann 1200 Baud mal 10, weil ja alle 100ms sind das dann Minimum 12000 Baud/s, die er erreichen muss.
oder andersrum 19200 Baud / 1200 = 16
1/16 = 0,0625 -> 62,5ms bräuchte in dem Falle bei 19200 die Übertragung mindestens. 4800 und 9600 kannst Du ergo schonmal abhaken.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Ja deswegen würde ich das Byteweise machen.
Also das erste Byte ist Wert1, usw.
Dadurch spart man sich alle Trennzeichen. Durch Start und Stop bits wird der Parameterzähler resetet und controlliert. Wenn er sich beim Stopbit verzählt hat, zählt der gesamte Durchgang nicht und es wird auf den nächsten gewartet.
Zudem brauchst du nichts mehr umrechnen und keine Strings zerlegen. Das einzige Problem, wäre wenn einer der Werte > 255 ist. Dann musst du 2 Bytes verwenden und die dann passend zusammenrechnen. Mit 2 Bytes kommst du erstmal bis 65535. Bei 3Bytes bis 16,7mio.
Wenn alle Werte in ein Byte passen, solltest du schon mit 4800Baud auskommen. Ich würde aber mindestens 9600 oder 19200 nehmen.
Achja zu deinem Problem mit dem Fusen, um den Controller auf 16Mhz laufen zu lassen, würde ich mal die Suche oder eine Suchmaschine befragen. Du bist nicht der erste der das Problem hat und es gibt viele gute Anleitungen dazu.
Gruß Daniel
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
In dem Falle ginge ich gleich generell auf 2 Bytes, als Int ist das dann -32768 bis +32768 als Word eben 0 bis 65535, + nochmal nen CRC8 dahinter, macht pro Wert 3 Bytes.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Lesezeichen