Forum: Mikrocontroller und Digitale Elektronik Serial.print timing


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von F. G. (no_pilot)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche die reale Zeitdauer zur Seriellen UART-USB Übertragung zu 
ermitteln. Zwischen einem Arduino Uno (ATMega328P) und Win7.


Dazu habe ich mir unten angehängte Testfunktion geschrieben. Den Pin 
Status schaue ich mir mit dem Oskar an.
Erwarten würde ich einen linearen Anstieg der Zeitdauer pro gesendetem 
Zeichen - Dies ist aber nicht der Fall! Könnte mir jemand auf die 
Sprünge helfen, warum das so auftritt??


Die Baudrate ist auf 19200 eingestellt. Das Phänoment tritt aber auch 
bei anderen Geschwindigkeiten auf.



Danke für Euer Input!
Felix
---
EDIT: Der gelbe Verlauf stellt den Status von "test_pin" dar!
---

void FunktionSerialPrint()  {
   for (int k=0;k<25;k++)
   {
      digitalWrite(test_pin,HIGH);

         for(int j=(25-k);j<20;j++) {

         Serial.print("O");
         }

      Serial.println("");
   digitalWrite(test_pin,LOW);
   delay(2);
   }

}

: Bearbeitet durch User
von Stefan P. (form)


Bewertung
1 lesenswert
nicht lesenswert
Merkwürdig. Häng doch mal zusätzlich noch den Kanal 2 an den UART-TX - 
vielleicht sieht man dann was los ist.
Am besten dann als PNG anhängen.

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Felix G. schrieb:
> Erwarten würde ich einen linearen Anstieg der Zeitdauer pro gesendetem
> Zeichen - Dies ist aber nicht der Fall! Könnte mir jemand auf die
> Sprünge helfen, warum das so auftritt??

Weil Serial.print in einen Puffer schreibt. Die ersten Bytes füllen den 
Puffer - das geht quasi "instant" - und sobald er voll ist, wird 
gewartet bis ein Platz im Puffer durch die Übertragung frei wurde. Der 
USB-Adapter fügt aber weitere Verzögerungen hinzu. Darüber ist quasi 
keine echtzeitfähige Übertragung zu erreichen. Wenn du das Timing genau 
steuern willst, müsstest du ein eigenes USB-Gerät implementieren und 
z.B. Isochrone Transfers nutzen.

von Benjamin S. (recycler)


Bewertung
0 lesenswert
nicht lesenswert
versendest du die Zeichen über USB (also ist der ATMEGA über USB 
verbunden) und das Protokoll ist RS232 oder hast du einen UART2USB 
Konverter dran?

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
> Die Baudrate ist auf 19200 eingestellt.
> Das Phänomen tritt aber auch bei anderen Geschwindigkeiten auf.

Ich finde, dass 19200 Baud ganz gewöhnlich sind, also eher kein 
Phänomen.

> ich versuche die reale Zeitdauer zur Seriellen UART-USB Übertragung
> zu ermitteln

Das ist doch ganz einfach. Da die Schnittstelle mit Puffer sendet, kann 
sie die Zeichen lückenlos nacheinander senden. Jedes Zeichen umfasst ein 
Start-Bit, 8 Daten-Bits und ein Stop-Bit.

Die Schnittstelle sendet also 1920 Zeichen pro Sekunde - es sei denn, du 
sperrst Interrupts für ungewöhnlich lange Zeit oder fügst absichtlich 
Verzögerungen ein.

Ich nehme mal an, dass die gelbe Linie das Signal von deinem "test_pin" 
darstellt. Das Signal geht anfangs nur sehr kurz auf High, weil der 
Sendepuffer Platz frei hat. Sobald er voll ist, wartet die Funktion 
Serial.print() darauf, dass Platz frei wird. Und das dauert genau so 
lange, wie die Übertragung eines Zeichens dauert.

: Bearbeitet durch User
von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:

> USB-Adapter fügt aber weitere Verzögerungen hinzu.

Aber nicht auf der µC Seite. Der 328P hat AFAIK  keine 
Datenflusskontrolle, und bei 19200 Baud ist die dank groszügiger FIFOs 
im USB2UART auch nicht notwendig.

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Jim M. schrieb:
> Aber nicht auf der µC Seite.
Stimmt. Aber wenn eine Übertragung echtzeitfähig sein soll impliziert 
das meistens auch die Gegenstelle :) Wenn es nur darum geht, wie lange 
der Controller damit beschäftigt ist, gibt's eh bessere Lösungen als 
Busy Waiting - z.B. Interrupts und FIFO's (und DMA bei Controllern die 
es können), dann ist die Zeit pro Byte immer minimal.

Jim M. schrieb:
> und bei 19200 Baud ist die dank groszügiger FIFOs
> im USB2UART auch nicht notwendig.
Ja. Aber wenn man möchte dass Datenpakete innerhalb einer bestimmten 
Zeit am PC ankommen bzw. man eine Antwort erhält, wird das mit so einem 
Adapter schwierig, wenn die Zeit nicht "lang" ist.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.