Liebe Leser,
ich übertrage Daten über USB an einen Host-PC. Durch den AVR Treiber
wird an diesem ja ein virtueller COM-Port für die Übertragung
eingerichtet. Als µC nutze ich den Atmel 32UC3A1512.
Hierzu benutze ich die Funktion in "uart_usb_lib.h"
1 | uart_usb_putchar( SENDEWERT );
|
Alleine dieser Aufruf bringt kein Erfolg.
Erst durch folgenden Code ist das Senden an den virtuellen COM-Port
möglich. Ich lasse es mir per Terminalprogramm hterm am PC anzeigen.
1 | if ( TRUE == uart_usb_tx_ready() )
|
2 | {
|
3 | uart_usb_putchar( SENDEWERT );
|
4 | uart_usb_flush(); // nicht warten bis Sendebuffer voll, sondern sofort senden
|
5 | }
|
Meine Frage: Wenn ich nun kontinuierlich jede ms ein Wert an den Host-PC
schicken möchte, dann könnte ich dies ja in eine ISR (Interrupt Service
Routine)"verpacken". Der µC fungiert in dieser Kommunikation wohl eher
als Slave bzw. Device. Der PC wird doch sicherlich die Host Funktion
übernehmen. Also initiiert der PC ja die Datenübertragung?! Der µC
pushed nun nicht die Daten zum Host, sondern der Host fragt
kontinuierlich den Sendebuffer der µC ab, oder!? Wenn diese Abfrage aber
nur beispielsweise alle 2ms erfolgen würde, dann wäre das Senden über
die ISR, die jede ms aufgerufen wird, nutzlos?!
Hintergrund ist:
Mir ist nämlich aufgefallen, dass wenn ich in einer ISR jede ms einen
Wert an den Host-PC sende, kann ich die Anzahl der empfangenen Werte
übers Terminalprogramm Hterm zählen lassen.
10min = 600s = 600.000ms
Folglich müsste ich in 10min 600.000 Werte empfangen.
Nun habe ich beim Start der Übertragung die Stoppuhr loslaufen lassen.
Als Hterm mir anzeigte, dass ich den 600.000sten Wert empfangen habe,
stoppte ich die Zeit auf der Stoppuhr. Es müsste eine Zeit von 10min auf
der Uhr zu lesen sein. Dies war aber nicht der Fall, sie zeigte nämlich
10:07 min an. Ich finde, dass 7 Sekunden doch schon eine gewaltige
Abweichung sind.