Hallo zusammen,
die letzten zwei Tage habe ich etwas mit dem USB-Interface gekämpft. Ich hatte bereits vorher provisorisch das Datenprotokoll, das auch die CC-Schnitte verwendet, implementiert. Die fehlende Begrenzung der Frames war mir jedoch ein Dorn im Auge und hat immer wieder für Schluckauf in Rocrail gesorgt. Daher habe ich nun das SLCAN-Format für Extended CAN-Frames implementiert. Dabei hat sich gezeigt, dass die von mir bisher verwendete Software für den ATmega16u2 nicht leistungsfähig genug war. Nun habe ich dort die Software drauf, die auch der Arduino verwendet. 500000 Baud sind damit auch mit dem internen 8MHz-Takt kein Problem mehr.
Um auch wirklich alle Frames zu erwischen und über das Interface zu übertragen habe ich meiner CAN-Bibliothek nun auch einen Ringpuffer spendiert, der CAN-Frames zwischenspeichert. Zudem werden SLCAN Frames und "echte" CAN-Frames gleichwertig behandelt. Das eigentliche Programm unterscheidet also nicht, woher die Frames kommen. Zudem wird in beide Richtungen eins zu eins durchgereicht, unabhängig vom Hauptprogramm. Erste Tests sehen sehr vielversprechend aus. Als Stresstest habe ich meinen Updater verwendet, der ca. 1300 Frames in zwei Sekunden über den Bus jagt. Davon ist kein einziger Frame verloren gegangen.
So funktioniert die Schnittstelle anstandslos mit Rocrail zusammen, vorausgesetzt man sendet nicht auch noch ein "New Line" nach dem [CR] jedes Frames. Das habe ich eingebaut, um in einem Terminal den Datenverkehr beobachten zu können. Rocrail verschluckt sich dabei ganz böse und meckert wegen Timeouts. Warum [NL] nicht einfach ignoriert wird ist für mich nicht ganz nachvollziehbar. Ohne das [NL] funktioniert aber alles Wunderbar.
Falls für sowas mal Bedarf bestehen sollte kann ich mir auch vorstellen eine kleinere Platine zu entwickeln, die lediglich als Interface fungiert.