Forum: Mikrocontroller und Digitale Elektronik Arduino an einzelnen USB Ports gesperrt


von Frank M. (framucoder)


Lesenswert?

Hallo, ich bin neu hier im Forum und habe - kaum zu Glauben ;-) - auch 
gleich ein Problem parat.

Aktuell sitze ich an einem Arduino Projekt und bereite dafür 
verschiedene Bibliotheken vor. Dabei will ich auch ein einfaches 
Serielles Protokoll schreiben und wollte dies mit einer 
Beispielapplikation testen.

Dafür habe ich folgende Konstellation aufgebaut:
1
PC (Terminal 1) <=(übliche USB Verbindung)=> Arduino Uno/R3 <=(SW Serial über PIN 6/7)=> USB/Serial Adapter <=> selber PC (Terminal 2)

Als USB/Serial Adapter habe ich folgendes verwendet:
https://www.amazon.de/gp/product/B0757FQ5CX
Der kommt mit 3,3V und 5V zurecht, ich habe aber nur dessen GND mit dem 
Arduino verbunden, 3V3 und +5V vom Adapter hängen in der Luft.
Im ersten Schritt habe ich nur RXD mit dem TX Pin (SW Serial, bei mir 
Pin 7) und dann den Arduino per USB am PC angeschlossen. Dabei hat schon 
der USB/Serial Adapter angefangen zu leuchten, scheinbar wird er schon 
über GND/RXD mit Strom versorgt?
Ich habe trotzdem auch den USB/Serial Adapter per USB an den PC 
angeschlossen und habe über dessen Verbindung tatsächlich das empfangen 
(Terminal 2) können, was der Arduino sendet.

Nun wollte ich natürlich auch die Gegenrichtung testen, habe also 
zunächst zur Sicherheit wieder alle USB Verbindungen getrennt und TXD 
des USB/Serial Adapter mit RX (bei mir Pin 6) vom Arduino verbunden. Zum 
Schluss habe ich auch USB wieder verbunden.
Nachdem ich Daten in Terminal 2 eingegeben, hätte eigentlich was im 
Terminal 1 auftauchen müssen, tat es aber nicht. Nach einer Weile habe 
ich gemerkt, dass der Arduino nicht mehr als Serielle Schnittstelle 
erkannt wurde, stattdessen war im Geräte-Manager „Unbekanntes USB-Gerät 
(Fehler beim Anfordern einer Gerätebeschreibung.)“ zu finden. 
Abziehen/Anstöpseln oder Windowsneustart hat nicht geholfen, auch mit 
getrenntem USB/Serial Adapter.
Zunächst habe ich befürchte, dass ich mir den PC USB Port durch 
Rückspeisung kaputt gemacht habe. Nur passt das nach meinem Verständnis 
nicht, immerhin habe ich die 3V3/5V extra nicht verbunden und die Tx 
Leitung sollte ja dafür gedacht sein mit einem anderen Rx verbunden zu 
werden egal ob 5V oder 3,3V Logik. Allerdings bin ich auch kein HW 
Experte.
Es hat sich herausgestellt, dass der PC USB Port noch funktioniert. Auch 
andere Arduinos werden dort erkannt. Der betroffene Arduino Uno 
funktioniert sogar weiterhin an anderen PC USB Ports problemlos.
Nur die Kombination Arduino und dieser eine (ok, inzwischen sind es zwei 
:-/ ) Port(s) will nicht.

Für mich macht es den Anschein, dass mein Rechner das „böse“ USB Gerät 
erkannt hat und fortan an diesem Port Aussperrt.
Deswegen habe ich mal in der Registry (Win10 Rechner) alle Schlüssel mit 
Verbindung zu „COM 3“ gelöscht. Natürlich habe ich die Einträge vorher 
gesichert.
Unter 
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\VID_2341&PID_0043\<irge 
ndeineNummer>  gab es noch einen Schlüssel „Properties", auf den ich 
keinen Zugriff habe und dessen Zugriffsberechtigung ich auch nicht 
ändern konnte. Ob dort noch etwas wichtiges drinne ist kann ich also 
nicht sagen. Stattdessen habe ich eben die Werte unterhalb von 
VID_2341&PID_0043 gelöscht, die ich konnte. Nach einem Windowsneustart 
hat sich nichts an den beschriebenen Verhalten geändert, der Arduino 
bleibt an diesem Port stumm, wird nur mit Strom versorgt.

Vor einigen Wochen ist mir etwas ähnliches passiert. Da hatte ich 
versehentlich ein anderen Arduino Uno parallel sowohl extern als auch 
über USB mit Strom versorgt. Seitdem wollte er außer Strom nix mehr vom 
PC entgegennehmen. Da wusste ich zumindest was ich falsch gemacht hatte 
und da der PC USB Port noch funktionierte, dachte ich, ich hätte auf 
Arduino-Seite was kaputt gemacht. Wie sich nun aber herausstellt spricht 
auch dieser Arduino fröhlich an anderen USB Ports und siehe da, sogar an 
den bisher verbotenen Port klappt es wieder.

Das deutet für mich darauf hin, dass es keine Sperrliste mit bösen USB 
Geräten gibt sondern nur einen Sperreintrag für ein einzelnes Gerät pro 
Port. Eventuell macht das ja schon der USB Controller nicht Windows. Das 
würde auch erklären warum nicht einmal die VID/PID im Geräte-Manager 
richtig angezeigt wird.

So, nun habe ich aber genug Erklärt, nun können meine Fragen kommen :D

Was ist hier schief gegangen? Habe ich hier was falsch gemacht, als ich 
den USB/Serial Adapter mit dem Arduino verbunden habe? Hätte ich doch 
auch 5V verbinden müssen oder ist gar der USB/Serial Adapter gar nicht 
für den beschriebenen Aufbau geeignet? Kann das wirklich ein USB 
Rückspeisung gewesen sein, etwa wenn Pin 6, aus welchen Gründen auch 
immer, doch als TX konfiguriert war?
Hat schon mal jemand was von diesen Sperreinträgen gehört/gelesen oder 
hat eine bessere Erklärung? Wie werde ich die Sperrung wieder los ohne 
ein anderes Gerät zu opfern?

Ich hoffe es kann mir hier jemand helfen, ansonsten schon mal danke fürs 
lesen bis hier her.

Vielen Dank,
Frank

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Im ersten Schritt habe ich nur RXD mit dem TX Pin (SW Serial, bei mir
> Pin 7) und dann den Arduino per USB am PC angeschlossen. Dabei hat schon
> der USB/Serial Adapter angefangen zu leuchten, scheinbar wird er schon
> über GND/RXD mit Strom versorgt?
Das nennt sich parasitäre Versorgung und kommt von einer Verletzung 
der Absolute Maximum Ratings aus dem Datenblatt: Dort steht, dass der 
RXD-Pin nicht mehr als Vcc+0,3V haben darf. Wenn du also keine Vcc hast, 
dann  ist Vcc = 0V und damit darf der RXD-Pin nur maximal 0V+0,3V = 0,3V 
haben.
Aber wenn du nun dort am RXD 5V anlegst, sind das 4,7V zu viel. Dann 
beginnt eine ESD-Schutzdiode zu leiten und "zieht" Vcc auf 4,7V. Und mit 
Vcc =4,7V läuft dann der Chip los.
Bis du RXD auf low umschaltest und 0V anlegst...

Fazit: du solltest nicht an einen Eingang eines unversorgten ICs eine 
Spannung anlegen.

Zum Rest kann ich nicht viel sagen, ausser dass meine USB-Ports auch 
manchmal recht seltsame Dinge machen und USB-Kartenleser sowie darin 
eingesteckte SD-Karten reproduzierbar erkennen oder auch nicht.
Ich habe jetzt einfach resigniert und nehme ein anderes OS, wenn es 
darum geht, solche Zugriffe nachvollziehbar abzuhandeln.

: Bearbeitet durch Moderator
von Frank M. (framucoder)


Lesenswert?

Lothar M. schrieb:
> Das nennt sich parasitäre Versorgung und kommt von einer Verletzung
> der Absolute Maximum Ratings aus dem Datenblatt: Dort steht, dass der
> RXD-Pin nicht mehr als Vcc+0,3V haben darf. Wenn du also keine Vcc hast,
> dann  ist Vcc = 0V und damit darf der RXD-Pin nur maximal 0V+0,3V = 0,3V
> haben.

OK, solange der Chip dadurch keinen Schaden nimmt sollte das ja nicht 
stören. Irgend eine Seite muss ich ja zuerst anstöpseln.

Zum Thema "USB-Ports machen seltsame Dinge" kann ich noch etwas 
beitragen.
Ich habe Linux vom Stick gebootet (ohne nachzudenken auch genau am 
genannten Port, hat aber problemlos geklappt) und auch dort wurde der 
Arduino zunächst nicht erkannt. Abziehen/Anstecken hat aber geholfen.
In Windows wurde er aber wieder nicht erkannt, also habe ich nochmals 
Linux gebootet und auch hier wurde er nicht mehr erkannt, egal wie oft 
ich Abziehen/Anstecken probiert habe.

dmesg sagt:
1
[  240.764593] usb 1-8: USB disconnect, device number 16
2
[  254.381359] usb 1-8: new full-speed USB device number 17 using xhci_hcd
3
[  254.509386] usb 1-8: device descriptor read/64, error -71
4
[  254.745382] usb 1-8: device descriptor read/64, error -71
5
[  254.981359] usb 1-8: new full-speed USB device number 18 using xhci_hcd
6
[  255.109381] usb 1-8: device descriptor read/64, error -71
7
[  255.345392] usb 1-8: device descriptor read/64, error -71
8
[  255.453424] usb usb1-port8: attempt power cycle
9
[  256.105357] usb 1-8: new full-speed USB device number 19 using xhci_hcd
10
[  256.105602] usb 1-8: Device not responding to setup address.
11
[  256.313363] usb 1-8: Device not responding to setup address.
12
[  256.521357] usb 1-8: device not accepting address 19, error -71
13
[  256.649364] usb 1-8: new full-speed USB device number 20 using xhci_hcd
14
[  256.649608] usb 1-8: Device not responding to setup address.
15
[  256.857599] usb 1-8: Device not responding to setup address.
16
[  257.065355] usb 1-8: device not accepting address 20, error -71
17
[  257.065448] usb usb1-port8: unable to enumerate USB device
18
[  273.541357] usb 1-8: new full-speed USB device number 21 using xhci_hcd
19
[  273.689885] usb 1-8: device descriptor read/all, error -71

Wichtiger als der an ein oder zwei Ports nicht erkannte Arduino wäre mir 
aber ob ich an dem Aufbau irgendetwas falsch gemacht habe.
1
Arduino    USB/Serial Adapter
2
            +5V (frei)
3
GND  ------ GND
4
Pin7 ------ RXD
5
Pin6 ------ TXD
6
            3V3 (frei)


Stark vereinfachter Code:
1
#include <SoftwareSerial.h>
2
3
int rxPin = 6;
4
int txPin = 7;
5
6
SoftwareSerial serX(rxPin, txPin);
7
8
serX.begin(9600);

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

nicht jeder Arduino Uno/R3 hat Trennwiderstände zum USB IC, deswegen 
kann es sein das der USB Chip die Leitung festhält!
Ein UNO hat nur eine serielle und wird darüber programmiert, willst du 
die nutzen müsstes du die Verbindung zum USB trennen!
Ein Arduio mega2560 hat noch weitere freie serielle Schnittstellen, aber 
immer gilt der kann darüber nicht versorgt werden zuerst muss der 
Arduino Power bekommen!

Wenn du dann noch was mit 3,3V Pegel anschliessen willst brauchst du oft 
auch Pegelwandler, an 5V läuft 3,3V Logik (Verbindung zun Raspi, EPS 
o.ä.) manchmal nicht!

Frank M. schrieb:
> Vor einigen Wochen ist mir etwas ähnliches passiert. Da hatte ich
> versehentlich ein anderen Arduino Uno parallel sowohl extern als auch
> über USB mit Strom versorgt

ja versehntlich darf man manchmal Chips nicht falsch verschalten.

zwei 5V Versorgungen zusammen müssen sich nicht vertragen, vor allem 
wenn die 5V nicht gleich sind, also eine 5,25V hat und die andere 4,75V 
+-5%.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Ich schätze, dass du durch die Chips beschädigt hast, als du 
Signal-Spannungen (Rx/Tx) anlegtest, während sie keine 
Versorgungsspannung hatten.

von Joachim B. (jar)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich schätze, dass du durch die Chips beschädigt hast

wenn das so ist dann nennt man das zerstört und nicht gesperrt.
Der Unterschied kaputt oder geperrt kann leicht getestet werden an einem 
anderen PC oder Raspi wo man die Arduino IDE neu erstmalig installiert!

von Stefan F. (Gast)


Lesenswert?

Joachim B. schrieb:
> wenn das so ist dann nennt man das zerstört und nicht gesperrt.

Das ist ja auch nichts gesperrt. Mal geht es, mal nicht. So habe ich ihn 
jedenfalls in seinen nachgereichten Infos verstanden.

von Am Chiemsee (Gast)


Lesenswert?

Frank M. schrieb:
> Dabei hat schon
> der USB/Serial Adapter angefangen zu leuchten, scheinbar wird er schon
> über GND/RXD mit Strom versorgt?

Der Adapter hat drei LEDs drauf, welche hat aufgeleuchtet?
RXD, TXD, PWR?
Wie hast Du das mit der Treiber Installation gemacht?
Der Adapter soll als COM Port erscheinen, VID = $10C4, PID = $ EA60.
Wenn das nicht so ist, dann schau mal mit USBviewer nach welche Geräte 
installiert sind, am besten alles nicht Aktive entfernen.
Es gibt auch Tools mit denen man belegte COM Ports entfernen kann.
Ansonsten bist irgend wann mal bei Com 200 oder so.
Treiber installation: Am besten von SiLab herunterladen, das zip File in 
einem Verzeichnis entpacken, dann vom Gerätemanager aus den Treiber aus 
dem Verzeichnis installieren lassen. Niemals das setup oder install exe 
ausführen.
Dann den Adapter testen, dazu die Pins RXD und TXD verbinden.
Mit einem Terminal Programm z.B. H-Term Zeichen senden, diese müssen 
dann auch empfangen werden.
Wenn das funktioniert, kannst weiter machen.

von Stefan F. (Gast)


Lesenswert?

Am Chiemsee schrieb:
> Es gibt auch Tools mit denen man belegte COM Ports entfernen kann.

Du meinst wohl den Gerätemenager. Da kann man inaktive Geräte per 
Menüoption einblenden und dann löschen.

von Am Chiemsee (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Du meinst wohl den Gerätemenager

Nein den Gerätemanger meinte ich nicht.
Sondern das hier:COM Name Arbiter Tool V1.0 - Reservierte COM-Ports 
freigeben

Das ist so eine Marote die man Windows nicht so leicht ab gewöhnen kann, 
das immer wieder ein neuer Com Port im Gerätemanager auftaucht, obwohl 
das gleiche Gerät angesteckt wird.
Das funktioniert, so lange das gleiche Gerät immer gleichen USB Port 
angesteckt wird. Nur wenn der USB Port gewechselt wird, hat man 
plötzlich wieder einen neuen COM Port.
So die Richtige Lösung habe ich dazu noch nicht gefunden, man kann zwar 
in der Registrie einen Eintrag ändern, das nur eine bestimmte Anzahl COM 
Ports geöffnet werden kann.
Ich nehme aber lieber das Tool wenn es mal wieder so weit ist.

von Am Chiemsee (Gast)


Lesenswert?

Am Chiemsee schrieb:
> Sondern das hier:COM Name Arbiter Tool V1.0

Gefunden habe ich es hier:
https://www.uwe-sieber.de/misc_tools.html

von Frank M. (framucoder)


Lesenswert?

So, Problem gelöst aber nicht verstanden ;-)

Ich hab mir extra einen billigen USB 2.0 Hub geholt. Damit kann ich den 
Arduino auch wieder an alle Ports betreiben. Außerdem kann ich damit 
auch beide Seiten, also Arduino und Adapter, gleichzeitig mit Strom 
versorgen. Ich habe auch zur Sicherheit noch jeweils 100Ohm zwischen die 
Datenleitungen gesteckt.
Mit dem Aufbau hat es dann auch problemlos geklappt, Daten fließen in 
beide Richtungen.

Zur Diskussion, zerstört oder gesperrt kann ich nur sagen, dass wenn da 
HW mäßig was kaputt gegangen ist, dann sicherlich nur eine Kleinigkeit. 
Bis auf das eine mal, bei dem es gestern Abend plötzlich unter Linux 
auch am „bösen“ USB Port funktioniert hatte, deutet alles auf gesperrt 
hin.
Vielleicht war es gestern einfach schon zu spät :-/

Am Chiemsee schrieb:
> Der Adapter hat drei LEDs drauf, welche hat aufgeleuchtet?
> RXD, TXD, PWR?

Die LEDs sind leider nicht wirklich beschriftet, aber ich würde es so 
deuten.
Zunächst hat PWR (rot) geleuchtet, liegt neben GND.
Dann hat RXD (blau) geleuchtet, liegt auch neben RXD.
Das wäre so ja auch erklärlich, zuerst liegt die Spannung an und wenn 
der Arduino fertig mit booten ist habe ich testweise was gesendet. Und 
das passt auch zu der Beobachtung jetzt mit funktionierendem Aufbau.

Treiber für den Adapter ist installiert, er wird problemlos als COM Port 
erkannt.
Es war ja auch nur der Arduino als COM Port verschwunden.

Ich bin nun wieder arbeitsfähig, trotzdem würde ich gerne verstehen was 
passiert ist. Für mein Projekt ist dass nicht relevant aber wenn ich 
meine Bibliothek veröffentlichen will, dann auch mit Beispielcode. Ich 
möchte aber ungern ein Beispiel präsentieren, mit dem man potenziell 
sein USB Port zerstört.

Meine Vermutung ist, dass mit anstecken des Adapters eine 
Spannungsspitze über TXD zum Arduino Board und von dort irgendwie bis 
zum USB Port gewandert ist und dort irgendeine Fehlerbehandlung 
ausgelöst hat.

Kann man das Schaltungstechnisch unterdrücken oder mindestens dass 
Risiko minimieren?
Muss man dringend die Spannungen auf beiden Seiten gleichzeitig anlegen?

Im übrigen würde ich in meinem Beispielcode auf 2 Arduinos verweisen, 
dass Problem mit den unterschiedlichen Logikpegeln entfällt dann schon 
mal.

von Stefan F. (Gast)


Lesenswert?

Bei manchen Computern sind die 5V Leitungen mit Polyfuses abgesichert. 
Oft erhöht sich ihr Innenwiderstand nachdem sie zum ersten mal ausgelöst 
haben. Danach funktionieren an solchen Ports nur noch Geräte mit 
geringer Stromaufnahme wie z.B. Mäuse.

Derart "verschlissene" Polyfuses können genau sie zu dünne Kabel und 
verschlissene Steckverbinder zu sporadischen Fehlfunktionen führen - 
insbesondere bei Geräten ohne eigene Stromversorgung.

Wenn du einen Hub mit eigenem Netzteil verwendest, stören die Polyfuses 
des Computers schon mal nicht. Ein Knackpunkt weniger.

von Frank M. (framucoder)


Lesenswert?

Am Chiemsee schrieb:
> Das ist so eine Marote die man Windows nicht so leicht ab gewöhnen kann,
> das immer wieder ein neuer Com Port im Gerätemanager auftaucht, obwohl
> das gleiche Gerät angesteckt wird.

Da kann ich mich nicht beschweren, egal wo ich mich anstöpsle, bekomme 
ich immer die selbe COM Port Nummer, nur nach dem Löschen der 
Registry-Einträge gab es neue Nummern. Das Tool wird sicherlich nichts 
anderes machen als ich manuell gemacht habe.

Aber ich kenne durchaus auch noch den Fall, dass ein COM Port plötzlich 
für ein anderes Gerät wiederverwendet wird. Wenn man dann das 
ursprüngliche Gerät zusätzlich ansteckt, hat das dann natürlich eine 
neue Nummer.

von Einer K. (Gast)


Lesenswert?

Frank M. schrieb:
> Da kann ich mich nicht beschweren, egal wo ich mich anstöpsle, bekomme
> ich immer die selbe COM Port Nummer,
Dann hast du Geräte, welche eine Seriennummer mitliefern.
z.B. Arduino UNO und Mega mit dem 16U2 als Serial Adapter tun das so.

von Frank M. (framucoder)


Lesenswert?

Stefan ⛄ F. schrieb:
> Bei manchen Computern sind die 5V Leitungen mit Polyfuses abgesichert.
> Oft erhöht sich ihr Innenwiderstand nachdem sie zum ersten mal ausgelöst
> haben. Danach funktionieren an solchen Ports nur noch Geräte mit
> geringer Stromaufnahme wie z.B. Mäuse.

OK, danke für den Hinweis, wieder was gelernt :-)
Gibt es solche Polyfuses auch in Kabeln?

Ich hatte auch ein USB Verlängerungskabel geholt, damit ich zur Not auch 
eins kaputt machen kann, falls ich an den USB Leitungen was messen will.
Nun hat sich herausgestellt, dass es schon reicht ein Verlängerungskabel 
dazwischen zu haben nur damit die Verbindung klappt.

Häää?

Ich bin nur SW Entwickler, also Entschuldigung, wenn dass hier gleich 
Blödsinn ist:

Längere Leitung => grösserer Widerstand => geringer Strom => Polyfuses 
"lösen" nicht aus.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Gibt es solche Polyfuses auch in Kabeln?

es gibt zwar vieles aber das ist relativ unwahrscheinlich.
Leider gibt es sehr unterschiedliche USB Kabel und auch Qualitäten und 
neuerdings ist die Masche mit dicken Kabeln mehr Kupfer vorzugauckeln 
dabei ist Kupfer oft dünn und manchmal auch nicht vorhanden nur die 
Isolierung ist dick und manchmal fehlen die Datenleitungen bei USB 
Netzteile!
Von aussen sieht man es den Teilen ja nicht an!
Manchmal stimmt auch die Impedanz nicht so das einige mitgelieferte 
Kabel nur an dem zugehörigen Gerät funktionieren, alles schon seit 
Beginn von USB selbst erlebt!

: Bearbeitet durch User
von Frank M. (framucoder)


Lesenswert?

Ich hätte wohl noch etwas genauer ausholen sollten, warum ich gefragt 
habe, ob es Polyfuses auch in Kabeln gibt. Bisher hatte ich das Kabel 
ausgeschlossen, da es ja an anderen Ports mit den selben Kabel geklappt 
hat. Ich habe aber nur 3 Ports probiert. Mit den beiden Frontports habe 
ich den Fehler beobachtet. Dort habe ich dass Kabel immer direkt 
angeschlossen. Den einen hinteren Port habe ich mit Verlängerungskabel 
nach vorne geholt, da hatte ich also immer ein längeres Kabel dabei.
Der andere Arduino hatte ja auch an den vorderen Ports funktioniert. 
Dabei hatte ich aber ein anderes USB Kabel genutzt. Wenn statt Arduino + 
Kabel einfach nur den Arduino tausche, kann ich den Fehler auch mit 
beiden Arduinos beobachten. Der Fehler tritt also nur in Zusammenhang 
mit dem einen Kabel auf und auch nur, wenn ich das Kabel direkt ohne 
Verlängerung nutze.
Vermutlich haben sowohl das Kabel als auch die beiden Frontports einen 
kleinen Schaden.

Inzwischen habe ich auch noch zwei Optokoppler gefunden, damit bin ich 
auf jeden Fall auf der sicheren Seite.

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.