Forum: Mikrocontroller und Digitale Elektronik Virtual Com Port Driver STM32 Port zuweisung


von Grabner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich möchte wissen ob und wenn ja, wie es möglich ist mehrere STM32 
Controller die ich mit dem PC verbinde (nicht gleichzeitig sondern 
hintereinander) immer auf den selben Com Port zuzuweisen.

Das es im GeräteManager manuell funktioniert ist mir klar.
Rechtsklick auf 
Port->Eigenschaften->Anschlusseinstellungen->Erweitert...

Ich möchte jedoch das automatisch sobald ein ST Controller dran hängt, 
immer der COM Port (z.B.: 20) verwendet wird.

Bereits verwendete Geräte werden wieder auf ihren erstmaligen Port 
zugewiesen, neue Geräte jedoch nicht.

Das sieht dann bei mir so, wie im Bild zu sehen ist, aus.

Hat hier irgendjemand eine Idee.

Vielen Dank im Voraus!

von Mac G. (macgyver0815)


Lesenswert?

Das würde mich auch sehr interessieren - aber generell und nicht nur für 
STM32.

von Kirsch (Gast)


Lesenswert?

Der generische Windows CDC-Treiber weist einem Gerät immer die gleiche 
COM-Nummer zu. Und vergibt eine neue wenn du die USB-Buchse wechselt.

Daher empfiehlt es sich die Geräte regelmäßig zu "deinstallieren" damit 
die COM-Nummer wieder frei wird.


Im Geräte Manager Ansicht->"Ausgeblendete Geräte Anzeigen" aktivieren.
Und dann alle aus gegrauten Einträge bei Anschluss(COM & LPT) entfernen.

von Grabner (Gast)


Lesenswert?

Die USB Buchse wird dabei aber nicht gewechselt!

Es geht darum wenn ich verschiedene MCUs anschließe bekommt jeder eine 
eigenen Com Port. Und das möchte ich nicht.
Mit verschiedene meine ich es sind alle STM32f103RE jedoch habe ich 
mehrere davon.

von Peter II (Gast)


Lesenswert?

Kirsch schrieb:
> Der generische Windows CDC-Treiber weist einem Gerät immer die gleiche
> COM-Nummer zu. Und vergibt eine neue wenn du die USB-Buchse wechselt.

das ist abhängig davon ob er die geräte unterscheiden kann - wenn eine 
Seriennummer vorhanden ist bekommen die geräte ihren COM-port wieder.

von Grabner (Gast)


Lesenswert?

Peter II schrieb:
> das ist abhängig davon ob er die geräte unterscheiden kann - wenn eine
> Seriennummer vorhanden ist bekommen die geräte ihren COM-port wieder.

Die werden sie wahrscheinlich haben, da bereits angeschlossene MCUs 
wieder auf ihren Port zugewiesen werden.

Jedoch möchte ich das egal welcher MCU angeschlossen wird, immer auf 
einen fixen Port zugewiesen wird!

von Dr. Sommer (Gast)


Lesenswert?

Mach halt keine COM-Port-Emulation, sondern implementiere ein 
gewöhnliches USB-Device. Auf das kannst du dann per libusb oder WinUSB 
zugreifen. Da man dabei im Programm nach der VID/PID/Serial suchen kann, 
entfällt die Auswahl des korrekten Anschlusses durch den Benutzer 
komplett, das Programm kann automatisch das richtige Gerät ansprechen.

von John-eric K. (mockup)


Lesenswert?

Das kann man über das deaktivieren der Hardwareseriennummer erreichen.

Das geht folgendermaßen:
* Startmenü -> Ausführen
* "regedit" eintippen
* In den folgenden Ordner gehen: 
„HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UsbFlags\“
* Rechte Maustaste -> Neu -> Binärwert
* Ihn folgendermaßen für ein Standard STM32 USB CDC nennen: 
IgnoreHWSerNum04835740
* rechte Maustaste auf den neuen Eintrag -> Ändern
* 01 eintippen.
* eventuell Neustarten

Wie der Name schon sagt, ignoriert er dann die Hardwareseriennummer die 
Windows veranlasst bei einem umstecken/Neugerät anstecken den Treiber 
neuzuinstallieren.

Der Name ist folgendermaßen aufgebaut und funktioniert auch bei FTDI:
IgnoreHWSerNum<USB_VID><USB_PID>

USB_VID und USB_PID können im Gerätemanager gefunden werden. Rechte 
Maustatse auf das Gerät -> Eigenschaften -> Karteireiter Details -> 
Eigenschaft: Hardware-IDs

von John-eric K. (mockup)


Angehängte Dateien:

Lesenswert?

Das sieht bei mir dann so aus wie im Bild.

Bei mir ist noch der STM32 DFU-Modus und der Standard FTDI COM PORT mit 
drinnen.

: Bearbeitet durch User
von Mike R. (thesealion)


Lesenswert?

Evtl. kanst du auch einfach nach dem Array
1
uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL] =

schauen. Ich haben dort einen festen Wert eingetragen und bei mir 
bekommen die Controller immer den gleichen COM Port. (Egal ob ich 
Platine A, B oder C nehme, der Com-Port ist immer COM4 (nur als 
Beispiel))

von Grabner (Gast)


Lesenswert?

Vielen Dank ich werde das mal ausprobieren und melde mich bald wieder!

von John-eric K. (mockup)


Lesenswert?

Naja der Nachteil ist dabei das du die Seriennummer aushebelst die man 
eventuell haben möchte. Wenn es nur Privat ist geht das aber sicherlich 
auch. Zusätzlich geht das aber auch bei Geräten bei denen man keinen 
Quellcode hat zum ändern.

Ich nutze das oben zB. auf meinem Entwicklungs-PC und am Produktions-PC 
beim Programmieren und Konfigurieren. Läuft da seit Monaten ohne 
Probleme.

Hier noch ein Link zu FTDI wo die das auch erklärt haben:
http://www.ftdichip.com/Support/Knowledgebase/index.html?ignorehardwareserialnumber.htm

: Bearbeitet durch User
von Adib (Gast)


Lesenswert?

Hi, bei mir bekommen die Stm32 auch immer den gleichen Port zugewiesen. 
Egal ob F1 oder F4 und egal an welcher Usb Buchse.
Ich habe noch ein altes Projekt mit PeripheralLib statt CubeMx. Dort 
wird immer eine ganz andere Portnummer zugewiesen.

Ist wohl eine andere device Id bei dem Treiber.

Adib.

von Grabner (Gast)


Lesenswert?

Ich hätte jetzt die einfachere Methode von Mike R. genommen.
1
uint8_t Virtual_Com_Port_StringSerial[VIRTUAL_COM_PORT_SIZ_STRING_SERIAL] =
2
  {
3
    VIRTUAL_COM_PORT_SIZ_STRING_SERIAL,           /* bLength */
4
    USB_STRING_DESCRIPTOR_TYPE,                   /* bDescriptorType */
5
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0
6
  };

Also für mich sieht das ja nach einer fixen Seriennummer aus.

Bzw. hier
1
void Get_SerialNum(void)
2
{
3
  uint32_t Device_Serial0, Device_Serial1, Device_Serial2;
4
5
  Device_Serial0 = *(uint32_t*)ID1;
6
  Device_Serial1 = *(uint32_t*)ID2;
7
  Device_Serial2 = *(uint32_t*)ID3;
8
9
  Device_Serial0 += Device_Serial2;
10
11
  if (Device_Serial0 != 0)
12
  {
13
    IntToUnicode (Device_Serial0, &Virtual_Com_Port_StringSerial[2] , 8);
14
    IntToUnicode (Device_Serial1, &Virtual_Com_Port_StringSerial[18], 4);
15
  }
16
}

sind die ID1 bis ID3 ja auch fix.

Versteh ich dann nicht ganz wie man zu einer anderen Seriennummer kommen 
kann, wenn alle MCUs das gleiche Programm haben.

von Clemens L. (c_l)


Lesenswert?

Grabner schrieb:
> hier [...] sind die ID1 bis ID3 ja auch fix.

Das ist wahrscheinlich das "unique device ID register" an Adresse 
0x1FFFF7AC.

von Grabner (Gast)


Lesenswert?

Clemens L. schrieb:
> Grabner schrieb:
>> hier [...] sind die ID1 bis ID3 ja auch fix.
>
> Das ist wahrscheinlich das "unique device ID register" an Adresse
> 0x1FFFF7AC.

ID1- ID3 ist ja eine Adresse und kein Wert. Bin ich blöd.

Kan ich hier eine eigene ID vergeben oder ist davon abzuraten?

von John-eric K. (mockup)


Lesenswert?

Du kannst da auch einfach 0 reinschreiben oder irgendeinen anderen 
32-Bit Wert. Du willst ja etwas gleich bleibendes damit Windows denkt es 
ist immer das gleiche Gerät.

Also ich glaube mit dem anderen wärst du schneller gewesen. Aber gut 
vielleicht soll es so auch bei anderen funktionieren.

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.