Forum: PC-Programmierung Timing Prob. bei USB-Übertragung


von StartER (Gast)


Lesenswert?

Hallo, ich nutze den FT245 USB Chip mit einem ATmega128. Senden und
empfangen klappt wunderbar, doch bei genauem Hinsehen, geht das ein
oder andere Byte verlohren. Meine Vermutung ist, dass der PC die Daten
nicht schnell genug einließt und dann das eine Byte von dem
darauffolgenden überschrieben wird!
Ich programmiere mit dem Borland C++ Builder und habe leider keinen
Plan, wie ich das Problem lösen kann. Ich lese Daten vom ComPort mit
dem Ereignis OnRxChar ein (ComPort1->Read(&a,1);).
Danke für Tipps und Lösungsvorschläge.

von Alex (Gast)


Lesenswert?

Bei sowas einfach einen Handshake-Mechanismus einführen. Also:
Mikrocontroller sendet meinetwegen 1024 Byte und wartet dann erst auf
ein Handshake des PC, bevor er die nächsten Daten sendet.

von StartER (Gast)


Lesenswert?

Leider bleibt bei meiner Anwendung keine Zeit auf ein Handshake zu
warten, da sonst mein µC anfallende Daten nicht vollständig aufnimmt,
verarbeitet und weiterleitet. Daten fallen alle 80µs an und die gesamte
Prozedur (Verarbeitung bis Versand) dauert etwa 70µs. Sollte ich nun
innerhalb der verbleibenden 10µs nicht den Handshake erhalten, verpasse
ich den nächsten Messwert - und das will ich nicht. Gibt doch bestimmt
auf der PC Seite eine möglichkeit, damit kein Byte verschluckt wird.
Gibts hier einen Borland C++ Builder Profi, der sich mit dem ComPort
auskennt?? Ich verwende zur Zeit die OnRxChar Funktion.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn Du auf der PC-Seite nicht einzelne Zeichen liest, sondern ganze
Blöcke, dann sollte das das Problem entschärfen.

Du solltest Dir bewusst sein, daß aufgrund der Struktur von USB der
Inhalt des FT245-internen FIFOs nur einmal pro Millisekunde an den PC
übertragen werden kann. Bei Deiner Datenrate sind das also etwa
120..130 Bytes pro Millisekunde.

Der Windows-Scheduler arbeitet üblicherweise mit einer Granularität von
10msec, mit Tricks lässt sie sich auf 1msec heruntersetzen. Für Deine
Anwendung bedeutet daß, daß Dein OnRxChar höchstens einmal pro
Millisekunde aufgerufen wird.
In Deinem OnRxChar-Handler solltest Du also bestimmen, wieviele
ungelesene Bytes im Puffer der Schnittstelle vorhanden sind, und diese
dann en bloc lesen.
Wie exakt dafür vorzugehen ist, kann ich Dir nicht sagen, weil ich BCB
(glücklicherweise) nicht näher kenne.


Dennoch viel Erfolg.

von john (Gast)


Lesenswert?

hallo,
ich hab da mal ne frage, kann mir jemand den source-code für den
zugriff unter borland c++ builder auf den ftdi ft245 chip senden, bzw.
hier im forum anhängen, da ich da keien plan habe wie...
das wäre super!

danke einstweilen

von Mario (Gast)


Lesenswert?

Ja, auch ich suche den Programm-Code für die Ansteuerung eines solchen
USB Bausteins FT245, leider habe ich bisher nicht das richtige
gefunden. Ich hoffe ihr könnt mir helfen.

Danke euch!
Mario

von Robert (Gast)


Lesenswert?

Tja ich weiss nicht ob der Hinweis für deine Anwendung zu spät kommt,

aber wenn man statt Ft245 einen FT232 nimmt, kann man ca. alle 44uS ein
Byte an den PC senden. Zum Empfang taugen die meisten Terminalprogramme
(Hyperterm) ganz ohne Handshake. Treiber gibts von FTDI umsonst.

Nur dein MC muss die Daten dann seriell z.B. mit 230KBaud senden. Bei
mir läuft so ein Aufbau mit einem Mega88 ohne Datenverlust.

Grüße Robert

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.