Sehr schnelle Ausgabe auf serieller Schnittstelle

Namd zusammen!

Da ich darauf stehe, sich ändernde Pegel als Diagramm ansehen zu können, mache ich Dinge wie diese hier. Das ist der Plot einer Aufzeichnung, die mit 230400 Baud übertragen wurde. In der Aufzeichnung gibt es je Zeile vier Werte, zum Beispiel:

...
999, 817, 787, 344
1000, 820, 753, 334
1001, 825, 705, 319
...

Dabei ist der erste Wert die Rückgabe von millis(), der Rest kommt durch drei analogRead() zustande.

Der Programmteil für die Ausgabe besteht aus mehreren Serial.print()-Zeilen: Jeweils ein Befehl für den Wert, dann ein Befehl für „“. Zum Schluss dann noch ein Serial.println().

In der ursprünglichen Aufzeichnung gibt es hin und wieder Zeilen, wo sich „minicom“ anscheinend „verschluckt“ hat. In solchen Zeilen stehen dann z. B. nur zwei Werte (1000, 65311) oder mehr als vier Werte (1000, 821, 734, 445, 628).

Kann ich die Übertragung für minicom evtl. „schmackhafter“ machen, indem ich zuerst eine Zeichenkette zusammenbaue und diese dann „in einem Rutsch“ übertrage? In der Referenz habe ich hierzu nichts finden können. Habe ich etwas übersehen? Gibt es andere Möglichkeiten, eine fehlerfreie Aufzeichnung mit sehr hoher Geschwindigkeit hinzubekommen?

Vielen Dank vorweg

Gregor

PS: Ich habe zwar auch ein kleines Taschen-Oszi, mit dem ich hinkäme, aber solche Aufzeichnungen mit einem Zweit- oder Dritt-Arduino anzufertigen ist meistens schneller erledigt. Zudem kann ich derartige Aufzeichnungen „nachbereiten“, was mit Oszi-Screenshots nicht möglich ist.

Moin,

nur um den Zusammenhang richtig zu verstehen: Du sendest von einem Uno (?) über USB an einen Linux (wegen minicom) PC ?

Beim schnellen Senden über USB gibt es ziemlich große Geschwindigkeitsunterschiede zwischen den einzelnen Boardtypen.

Bei normalen Arduinos gehen die Daten ja erst mal über UART zum zweiten Controller auf dem Board. Dort werden sie in Pakete zusammengefasst und dann blockweise über den USB geschickt. Der Transport geht dabei normalerweise mit einer anderen Baudrate, die scheint sich auch zwischen den Boards zu unterscheiden.

Meistens sind Boards mit nativem USB, also ohne zweiten Controller dazwischen schneller. Die sammeln die Bytes in einem internen Puffer und schicken die selber blockweise.

Bei einen Testsketch, wo der PC einen String an den Arduino schickt und dieser ihn wieder zurück, bekomme ich mit dem Teensy fast 50 mal mehr Daten übertragen, obwohl beide auf 115200 stehen. Einfach weil die ganzen Latenzen bei der USB-Übertragung viel kleiner sind.

ArduFE:
nur um den Zusammenhang richtig zu verstehen: Du sendest von einem Uno (?) über USB an einen Linux (wegen minicom) PC ?

Jein: Der sendende Arduino ist ein Nano. Beim Empfänger (PC mit Linux) vermutest Du richtig.

ArduFE:
Beim schnellen Senden über USB gibt es ziemlich große Geschwindigkeitsunterschiede zwischen den einzelnen Boardtypen.

Ich habe mir schon vorgenommen, die Datenübertragung auch mal mit einem „echten“ Nano zu testen (das zuerst verwendete Board ist ein Fernost-Nachbau). Und auf den Teensy muss ich wohl mal einen Blick werfen.

Gruß

Gregor

Hier mal ein Link auf die Teensy Doku, wo ein bischen was zur Thematik steht
http://pjrc.com/teensy/td_serial.html#txbuffer

Ob es was bringt, erst die komplette Zeile in einen Buffer zu schreiben und dann über ein einzelnes Serial.println zu übertragen, muss man ausprobieren. Kann schneller sein, oder auch nicht. Auf den 8-Bittern kommt da auch noch Speicherbelegung und Rechenzeit ins Spiel.

ArduFE:
Hier mal ein Link auf die Teensy Doku, wo ein bischen was zur Thematik steht
Teensyduino: Using USB Serial with Teensy on the Arduino IDE

Danke! Das scheint schonmal ein guter Startpunkt für die Beschäftigung mit dem Teensy zu sein.

Gruß

Gregor