PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Beispiel Komponente] UART Interrupt und Datenpaket Übertragung / parsen



shedepe
30.09.2013, 21:58
Hallo,
nachdem in einem andere Thread danach gefragt wurde habe ich eine kleine Beispielkomponente für einen Atmega 644P (Achtung 2 Uarts) erstellt, in der ich zeige wie man über den USART interrupt basiert Daten liest und wie man ein simples Paketdatenprotokoll parst.

Das Datenformat für das Beispiel ist:


STARTBEDINGUNG | LÄNGE | n * Datenbyte

n muss der LÄNGE entsprechen

STARTBEDINGUNG und LÄNGE sind jeweils Bytes.

Der Code ist meiner Ansicht nach gut kommentiert und wurde in der Form bereits in einem Projekt von mir verwendet, jedoch habe ich alle überflüssigen Teile entfernt.
Über Nachfragen würde ich mich natürlich freuen.

oberallgeier
01.10.2013, 08:27
... über den USART interrupt basiert Daten liest ... STARTBEDINGUNG | LÄNGE | n * Datenbyte ...Klar, genau so ein Protokollablauf (flexibel mit 0 .. 8 Datenbytes, max. derzeit 12 -- hab aber Deinen Code nicht durchgelesen) läuft bei mir seit längerer Zeit auf meinen m1284ern, jüngste Ergebnisse sind zum Beispiel hier (https://www.roboternetz.de/community/threads/62904-Servomesstester-(Servotester-und-–messaufbau)?p=585511&viewfull=1#post585511) und hier (https://www.roboternetz.de/community/threads/61379-Kopfsache-und-ein-m1284-etliche-Servos-viel-Alu?p=577672&viewfull=1#post577672). Das hatte ich in meiner Variante auch an Gerhard weitergeben ;.-.)

Dabei habe ich hier festgestellt (https://www.roboternetz.de/community/threads/62987-Rechenzeitbedarf-beim-Zahlenausgabe?p=586204&viewfull=1#post586204), dass die interruptgetriebene Serielle bei der Ausgabe deulich runtergebremst wird, wenn Puffersize des Ringspeichers und Länge der vom µController gesandten Strings nicht sonderlich passen und hatte als Grund zu wenig Speicher vermutet. Mittlerweile bekomme ich mit je einem Ringspeicher für RX und TX von 128 bytes bei meinem 20MHzer 256 kBd ( UBRR = 4) mit nem UART/U SB-Umsetzer mit FTDI bei teils heftiger DatenAUSGABE bequem hin; eine höhere Baudrate gibt mein Terminalprogramm nicht her . . .

Meine ausführliche Befehlsdokumentation/Bedienungsanleitung wird leider in den üblichen Fenstern (CODE, HTML oder PHP) nicht formatrichtig wiedergegeben - daher verzichte ich darauf diese Beispiel zu präsentieren. Die gabs aber auf der Hannoveraner Makerfaire ;.-.)

shedepe
01.10.2013, 09:16
Also mein Code würde bis zu einer Länge von 255 Datenbytes funktionieren. Allerdings verwende ich einfachheits halber nicht mal einen Ringbuffer sondern nur ein einfaches Array zum zwischenspeichern. An der Stelle könnte man z.B. ansetzen um noch mehr Leistung herauszuholen, jedoch hatte ich bisher keinerlei Probleme in dieser Hinsicht auch wenn ich das Verfahren für beide UARTS gleichzeitig verwendet habe, allerdings kann ich mir ein solches Verhalten bei großen Datenmengen durchaus vorstellen. Mein Beispiel zielt jedoch nicht darauf ab die größte Leistung zu erreichen sondern ein gut verständliches Einstiegsbeispiel zu geben.