www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FT232R auf disconnect überwachen


Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit,
ich schreibe aktuell eine Software (C++, Linux, D2XX-Treiber), die per 
USB Daten von einem AVR empfängt.
Wenn ich jetzt wären des Betriebes den FT232R abstecke und wieder 
anstecke, bekommt das Programm Probleme, weil die übertragenen Daten 
nicht mehr stimmen.
Kann ich ressourcenschonend innerhalb der Schleife, in der ich die Daten 
lese, feststellen, ob der Chip noch angesteckt ist? Die Überprüfung von 
FT_GetStatus hat keinen Effekt. Da wird, trotz disconnect, FT_OK 
ausgegeben.

thx4hlp

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn ich jetzt wären des Betriebes den FT232R abstecke und wieder
>anstecke, bekommt das Programm Probleme, weil die übertragenen Daten
>nicht mehr stimmen.

Kein Wunder. Ziehst du das Kabel von deiner Festplatte
auch einfach so raus?

Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn meine Platte Hotplug-fähig ist, dann ja. Und USB ist Hotplug-fähig, 
wenn ich mich nicht irre.

Autor: Matthias K. (nighty2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
>>Wenn ich jetzt wären des Betriebes den FT232R abstecke und wieder
>>anstecke, bekommt das Programm Probleme, weil die übertragenen Daten
>>nicht mehr stimmen.
>
> Kein Wunder. Ziehst du das Kabel von deiner Festplatte
> auch einfach so raus?

Was soll den so eine sarkastische Antwort?
USB wir nunma als Plug&Play was viele auch als UnPlug&GoAway sehen.

Und wenn man Software entwickelt, muss man nunmal auch immer an DAUs 
denken und so viele potentielle Fehlerquellen wie möglich ausschliesen.

Überleg mal wenn du während der Fahrt in einem Auto den Zundschlüssel 
ausversehen ziehst, Lenkradschloss geht rein du baust nen Unfall bei 120 
und der Airbag löst nicht aus.

Was sagt dann der Hersteller der Versicherung?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Kein Wunder. Ziehst du das Kabel von deiner Festplatte
>> auch einfach so raus?

>Was soll den so eine sarkastische Antwort?

Genau so war sie auch gemeint;)
Verbindung unterbrochen? Timeout benutzen.
Nach Timeout versuchen neu zu verbinden.
Kommt nix? Dann aufhören.

Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Verbindung unterbrochen?

Das war genau die Frage, wie das festzustellen ist.

Ich stelle fest, einmal eine Antwort, die unnütz ist, beim zweiten mal 
eine, die lediglich meine Frage wiederholt.
Was sollen mir deine Posts jetzt bringen?

Wenn du nicht helfen kannst/willst, solltest du nicht die 
Übersichtlichkeit hier absichtlich verringern indem du unnützes postest. 
Danke.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Verbindung unterbrochen?

>Das war genau die Frage, wie das festzustellen ist.

Frage senden. Kommt keine Antwort, Frage nochmal senden.
Kommt keine Antwort Frage nochmal senden. Kommt keine
Antwort Frage nochmal senden. Irgendwann aufhören die
Frage zu senden weil es keinen Sinn mehr macht?
Verbindung unterbrochen. Versuchen Verbindung komplett
neu aufzubauen. Kommt nix, dann abbrechen.

Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und welche Frage soll ich senden, wenn ich Daten empfange?
Genau das hab ich im ersten Post geschrieben. Wenn der µC auf keine 
Daten wartet, kann ich dem senden, was ich will, der wird nie antworten.

Trotzdem danke für deine Mühe, ich hoffe aber trotzdem darauf, dass 
jemand antwortet, der meine Frage gelesen hat.

Autor: Matthias K. (nighty2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann mach doch einfach das der uC Daten empfängt, dafür ist ja 
schlieslich ein Empfangs Interrupt da.

PC mit FT sendet Ping
uc sollte Pong antworten.
Antwortet er nicht dann Error

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Multi schrieb:
> Wenn ich jetzt wären des Betriebes den FT232R abstecke

Wie denn, was denn? Trennst du im Betrieb den FT232 vom µC oder meinst 
du nur das Herausziehen des USB-Steckers?

Was hältst du von der simplen Methode, die am USB-Anschluss anliegende 
Versorgungsspannung zu überwachen? Wenn keine Spannung vorhanden ist, 
dürfte entweder die Verbindung getrennt worden sein, oder der Host ist 
stromlos.

Gruß,
Magnetus

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Trotzdem danke für deine Mühe, ich hoffe aber trotzdem darauf, dass
>jemand antwortet, der meine Frage gelesen hat.

Das habe ich.

>Kann ich ressourcenschonend innerhalb der Schleife, in der ich die Daten
>lese, feststellen, ob der Chip noch angesteckt ist?

Ja, wenn für eine festgelegte Zeit nix mehr kommt,
dann ist die Verbindung tot.
Sowas nennt sich Protokoll. Wenn du eine Verbindung überprüfen
willst, dann mußt du Daten hin und her senden. Kommen
keine Daten mehr dann ist der Stecker raus.

Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias
ich werde nicht die Firmware ändern, da ist in diesem Fall völlig 
indiskutabel und IMO unsinnig

@Magnetus
ich stecke den USB ab. Und ich dachte mit meiner Aussage, ich würde 
unter Linux und dem D2XX-Treiber arbeiten, würde klarmachen, dass ich 
vom PC aus überwachen will ob der FTDI abgesteckt wird.

Nochmal, um alle klarheiten zu beseitigen ;)

AVR -> FTDI -> PC

AVR sendet ausschliesslich Daten und empfängt gar nichts (das bleibt 
auch so)
PC empfängt die Daten in einer Schleife und verarbeitet diese.
Wenn nun der USB-Stecker abgezogen wird, soll das die Software auf dem 
PC erkennen.
Da dummerweise FT_Read und FT_GetStatus weiterhin FT_OK liefern, klappt 
es damit nicht. Die Schleife läuft weiter und nach ein paar sekunden 
bricht das Programm mit nem Speicherzugriffsfehler ab, weil irgendwelche 
seltsamen Daten eingelesen werden, die entweder vom USB-Puffer oder dem 
D2XX-Treiber kommen, in jedem Fall sind die unerwünscht.
Um den Programmabsturz zu vermeiden will ich eben feststellen, wann die 
USB-Verbindung unterbrochen wird. In diesem Fall wird die Routine 
aufgerufen. die am Anfang feststellt, ob ein Chip angeschlossen ist.

Ich hoffe, jetzt ist wirklich alles klar und mein Problem eindeutig 
beschrieben. Und danke an alle, die helfen oder es zumindest versuchen.

Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Ja, wenn für eine festgelegte Zeit nix mehr kommt,
> dann ist die Verbindung tot.

Und da liegt das Problem, es kann sein, dass stundenlang keine Daten 
kommen, da die von externen Sensoren abhängen. Timeout fällt aus.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibts in der D2xx.DLL nicht ne Funktion, die das überwacht? 
FT_RESET/FT_RESCAN/FT_CYCLEPORT, irgendeine dieser Funktionen ist glaub 
ich dafür gedacht, ein Device wieder zu erkennen.

Ralf

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte ähnliche Probleme.
Wenn mein Programm gestartet wird und der FT232 noch nicht angeschlossen 
war, dann frage ich im Sekundentakt mit GetFTDeviceCount() ab ob Geräte 
angeschlossen sind. Wenn ich jetzt den FT232 an den USB Port anschließe, 
dann bekomme ich von GetFTDeviceCount() eine 1. Meine anschließenden 
GetFTDeviceDescription() und Open_USB_Device_By_Device_Description() 
lösen aber trotzdem ein "Invalid Handle" Error aus. Abhilfe brachte eine 
Abfrage:
If GetFTDeviceDescription(a)<> FT_OK then abort;

Das Stecker ziehen funktioniert bei mir jetzt ebenfalls ohne 
Fehlermeldung. Vor dem Read Befehl steht bei mir:
If Get_USB_Device_QueueStatus() <> FT_OK then ....
Und das Funktioniert bei mir. (WinXP, Delphi, FT232RL, Treiber von der 
Homepage)

P.S. die Für Delphi mitgelieferte D2XXUnit.pas enthällt folgende 
Funtkionen:

Function Get_USB_Device_QueueStatus : FT_Result;
Begin
Result :=  FT_GetQueueStatus(FT_Handle,@FT_Q_Bytes);
If Result <> FT_OK then FT_Error_Report('FT_GetQueueStatus',Result);
End;

Function GetFTDeviceDescription( DeviceIndex : DWord ) : FT_Result;
Begin
Result := 
FT_ListDevices(DeviceIndex,@FT_Device_String_Buffer,(FT_OPEN_BY_DESCRIPT 
ION  or FT_LIST_BY_INDEX));
If Result = FT_OK then FT_Device_String := GetDeviceString;
If Result <> FT_OK then 
FT_Error_Report('GetFTDeviceDescription',Result);
End;

Die Zeilen mit dem Errorreport musste ich jeweils auskommentieren, denn 
sonst wird die Fehlermeldung angezeigt befor ich darauf reagieren kann.
Ich kenne mich unter Linux nicht aus, denke aber es wird ähnlich sein.

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Multi schrieb:
> @Matthias
> ich werde nicht die Firmware ändern, da ist in diesem Fall völlig
> indiskutabel und IMO unsinnig

Ja wenn du so uneinsichtig bist, kann man dir eben nicht helfen. Eine 
einseitige Datenübertragung ohne Handshake, die auch noch beliebig lange 
ruhen kann, ist unsafe by design, sowas darf einem Entwickler einfach 
nicht unterlaufen.

Ohne bidirektionale Übertragung ist das Problem nicht lösbar, egal mit 
welcher Übertragungsstrecke. USB-Trennung ist nur ein Teilproblem, für 
Hotplug muss eben auch die Software hotplugfähig sein, und das ist sie 
nicht.

Natürlich schreist du jetzt los, dass dir das keine Hilfe ist. Genauso 
ist es, war auch meine Absicht. Was anders kannst du nicht erwarten, 
wenn du jeden vernünftigen Vorschlag als völlig indiskutabel 
bezeichnest. Es mag ja sein, dass du am µC schlicht nichts ändern 
kannst, aber dann kannst du eben auch das Problem nicht sachgerecht 
lösen.

Gruss Reinhard

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hne bidirektionale Übertragung ist das Problem nicht lösbar

Ich kenne einige Sensoren, die nur in eine Richtung senden und die sind 
auch "Sicher". Vielleicht sollte man die Daten aber in einen Rahmen 
packen, damit der PC besser erkennen kann ob alles stimmt. Ähnlich wie 
bei GPS Modulen, die reden auch einfach so los ohne gefragt zu werden.

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matze schrieb:
>>hne bidirektionale Übertragung ist das Problem nicht lösbar
>
> Ich kenne einige Sensoren, die nur in eine Richtung senden und die sind
> auch "Sicher". Vielleicht sollte man die Daten aber in einen Rahmen
> packen, damit der PC besser erkennen kann ob alles stimmt. Ähnlich wie
> bei GPS Modulen, die reden auch einfach so los ohne gefragt zu werden.

Die reden auch dauernd (immer das gleiche), und es ist nicht schlimm, 
wenn man was verpasst. Das scheint beim Fragesteller anders zu sein, 
sonst hätte er ja kein wirkliches Problem.

Gruss Reinhard

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fragesteller wird auch Daten verlieren wenn er den Stecker zieht. Er 
möchte nur das der PC erkennt wenn der Sensor abgezogen wurde, weil er 
dezeit (so wie ich es verstanden habe) weitere Daten vom USB Port lesen 
kann und nicht weis ob es zufällige Daten sind, oder sie von seinem 
Sensor stammen.
Das kann man umgehen wenn man einen Rahmen drum macht. 
Startbyte+Daten+Stopbye+CRC. Wenn die empfangenen Daten nicht in den 
Rahmen passen, dann ist das Gerät abgezogen. Oder man nutzt die 
Get_USB_Device_QueueStatus() Funktion, bei mir funktioniert es so.

Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reinhard Kern schrieb:
> Die reden auch dauernd (immer das gleiche), und es ist nicht schlimm,
> wenn man was verpasst. Das scheint beim Fragesteller anders zu sein,
> sonst hätte er ja kein wirkliches Problem.

Ich habe das Problem, dass die Software auf dem PC mit nem 
Buffer-Überlauf abbricht. Ob ich beim ziehen des Steckers Daten 
verliere, geht mir sonstwo vorbei. Ich hab auch nirgends geschrieben, 
dass der Datenverlust irgendein Problem darstellt.

Du kannst mir aber gerne erklären, wie ich 1-Wire-Sensoren dazu bringe, 
eine Zweiwegekommunikation zu fabrizieren. Dummerweise geben die Mittel 
für das Projekt nicht her, eigene Sensoren entwickeln zu lassen nur 
damit dieses in zwei Richtungen Daten austauschen. Offensichtlich ist 
das auch nicht nötig, sonst würde niemand diese, deiner Aussage nach, 
unsicheren Sensoren nutzen.
Ich gehöre somit zu den vielen tausenden uneinsichtigen, die eine 
einseitige Datenübertragung nutzen, weil es technisch nicht anders 
lösbar ist. Schande über mich!

BTW: der Controller am USB redet auch ständig das gleiche, nur nicht 
pausenlos. Es gehen bei einer Unterbrechung der Übertragung maximal 3 
Byte verloren. Also bitte nicht irgendwas in meine Posts 
reininterpretieren, was da nicht steht, das bringt mich und auch andere 
keinen Schritt weiter.



@Matze
danke, das probier ich mal.

@Ralf
danke, schau mir die Funktionen an.


Da wird hoffentlich was dabei sein und ich kann das Problem jetzt lösen 
:)

Autor: Zacc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Sensor einfach etwas vor sich hin plappert, kommt es nicht so 
genau darauf an, ob man einen Messwert erwischt oder nicht. Der Treiber 
wird eine exception werfen wenn der USB gezogen wurde, dh man kann diese 
Exception abfangen und nachher wieder neu aufsetzen.

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Multi schrieb:
> Du kannst mir aber gerne erklären, wie ich 1-Wire-Sensoren dazu bringe,
> eine Zweiwegekommunikation zu fabrizieren. ...
> BTW: der Controller am USB redet auch ständig das gleiche, nur nicht
> pausenlos. Es gehen bei einer Unterbrechung der Übertragung maximal 3
> Byte verloren. Also bitte nicht irgendwas in meine Posts
> reininterpretieren, was da nicht steht, das bringt mich und auch andere
> keinen Schritt weiter.

Hallo,

das entspricht nun aber garnicht mehr deiner Beschreibung von 23:57 und 
00:00 Uhr, da war noch von einem AVR als Sender die Rede. Und wenn ein 
Sensor Daten schickt, manchmal aber auch stundenlang nicht, finde ich 
das nach wie vor unsicher, egal wer das verbrochen hat - du weisst ja 
dann stundenlang nicht mal, ob da draussen überhaupt noch ein Sensor 
ist, auch ganz ohne Leitungsstörung.

Ganz abgesehen vom Sachproblem, ich finde es auch nicht in Ordnung, dass 
du so patzige Antworten jedem gibst, der dich auf Unstimmigkeiten 
hinweist, schliesslich will dich niemand hier fertigmachen, aber du 
stösst genau die Leute vor den Kopf, die dein Problem am genauesten 
verstanden haben. Ich bin da ja nicht der Einzige, das fängt schon mit 
den ersten Posts an.

Gruss Reinhard

Autor: lassativ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unverschaemtes Verhalten...der sitzt wohl am Arbeitsplatz und der Chef 
hat ihn...

Autor: peterfido (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Antwort von Matze ist doch die Lösung. Natürlich kann man den FT232 
auch mit einem nur sendenden AVR dafür auf Disconnect prüfen. Die 
Routinen sind im Treiber enthalten. Vor jedem Empfangen testen, ob das 
Device mit der Seriennummer noch vorhanden ist und dann einlesen. Steht 
alles gut in den Beispielen beschrieben. Ich nutze das unter VB6 + 
Windows XP seit einiger Zeit. Wie es mit den Linux Treibern aussieht, 
weiß ich nicht. Am PC nutze ich kein Linux.

Autor: Multi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reinhard Kern schrieb:
> das entspricht nun aber garnicht mehr deiner Beschreibung von 23:57 und
> 00:00 Uhr, da war noch von einem AVR als Sender die Rede.

Stimmt, allerdings besteht das Problem auch, wenn nur der nackte FT232 
am Port hängt. Somit ist es zur Problemlösung völlig unwichtig welche 
Daten wie woher gesendet werden.
Da das Betriebssystem erkennt, wann das USB-Kabel gezogen wird, ging ich 
davon aus, es ist kein Problem, das auch aus einem Programm raus zu 
überwachen. Ich will ja die Lösung nicht nur für dieses eine Projekt 
nutzen sondern auch für weitere.

Meine Antworten sollten nicht patzig rüberkommen, wenn dem so ist, 
entschuldige ich mich.

@lassativ
ich bin mein eigener Chef und dieses Projekt Hobby. Da du nichts zum 
Thema beiträgst, halte ich deinen Post für unverschämt, weil er mir 
unwares unterstellt und völlig OT ist.

@all
Mit den Hinweisen hier werde ich das Problem noch lösen, ich hab schon 
nen Ansatz muss aber vorher noch anderes machen. Sobald ich den Code 
komplett hab, werde ich ihn hier für die Nachwelt posten :)
Danke an alle, die geholfen haben.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.