Hallo Zusammen,
ich möchte von einem Windows 10 PC aus mit meinem Arduino über die serielle Schnittstelle kommunizieren. Der Arduino wird sowohl im (Windows-) Gerätemanager als auch in der Arduino IDE problemlos erkannt. Mein Ziel ist es aber, diesen Arduino bzw. den von ihm belegten COM-Port in einem eigenen C-Programm eindeutig zu Finden. Ich schaffe es, den vom Arduino belegten Port zu finden, aber eben nur soweit das ich weis, dass dieser Port belegt ist, aber nicht von was. Hat von euch jemand so etwas schon einmal Programmiert und kann mir auf die Sprünge Helfen?
Gruß Klaus
Wenn du nach der angeschlossenen Schnittstelle des Arduino suchen kannst, sollte das doch funktionieren.
Lies dazu den Beitrag durch. (Übersicht bei den Comports)
Soweit mir bekannt kann man die Registry darauf hin untersuchen.
Mit der dort zu findenen Pid Vid kannst du grob das Gerät bestimmen
Bei Arduinos mit nativen USB kannst du manchmal/meist über die Seriennummern, meist aus der ChipID generiert, den konkreten Arduino identifizieren. z.B. ein Dutzend, ansonsten identischer, UNOs voneinander unterscheiden.
Auch die Seriennummer findet sich in der Registry
Bei manchen USB Adaptern, z.B. CH340 wird diese Seriennummer temporär per Zufall bestimmt.
Oder sie findet sich im EEPROM des CH340 oder FTDI232. Kann man dann also selber bestimmen.
alle com ports der Reihe nach durchgehen
den Partner fragen, bist es du?
Horchen was der andere zurückmeldet
Hier habe ich sowas gemacht.
Musst Du für Dich adaptieren...
Mach dich unter Windows mal mit der " Win32_SerialPort-Klasse " vertraut.
Ist VC-Code aber kann man auch adaptieren.
Hier sogar noch eine Hilfe aus den MS-Forum
Gruß
Pucki
Das ist Portconfig und hat nichts mit Deviceconfig zu tun.
Und DAS sollte mit den Links von mir problemlos möglich sein.
Ich muss halt nur nach den NAMEN des Gerätes suchen. Also eine Schleife machen, alle Namen abfragen, und wenn es der richtige ist, die Portdaten abfragen,
Fertig ist.
Nebenbei für Port-Config brauche ich das nicht. Da sage ich einfach COM1.Baudrate = 9600 und fertig ist.
DAZU reicht das in der IDE Standart-System völlig aus.
Gruß
Pucki
Du wirst mir doch jetzt sicher auch erklären wie Du heraus bekommst, welches Produkt sich an der Schnittstelle befindet.
Nein. Du kannst keinen Produktnamen abfragen.
Fragst Du registry ab siehst Du für jeden aktiven Port: was da dran hängt und musst nicht Rätsel raten.
Zitat:
Name
Datentyp: string
Zugriffstyp: Schreibgeschützt
Qualifizierer: DisplayName ("Name")
Bezeichnung, unter der das Objekt bekannt ist. Bei unterklassigen Klassen kann die Eigenschaft als Schlüsseleigenschaft überschrieben werden.
Diese Eigenschaft wird von CIM_ManagedSystemElement geerbt.
Sollte die richte sein, ansonsten einfach nach NAME suchen. Einevon den wird es schon sein.
Gruß
Pucki
Zu nächst mal ein Danke für alle Antworten.
Hallo noiacsa,
den von Dir vorgeschlagenen Weg habe ich zuerst versucht.
Ich bekomme aber auch für den COM Port wo der Arduino angeschlossen ist ein INVALID_HANDLE_VALUE zurück, warum, blicke ich nicht ??
bool InitAduComPort(void)
{
#define PORTZAHL 7 // Anzahl der abzusuchenden Ports
COMMPROP commProp;
bool ok = false;
int i = 0, x = 0;
char port[PORTZAHL][5] = { "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9" };
char Befehl[2];
char ReadBuffer[10] = { 0 };
LPDWORD charRead = 0;
memset(&commProp, 0, sizeof(COMMPROP));
for (i = 0; i < PORTZAHL; i++) // Boardanschluss Suchen
{
hDevAID = CreateFile(port[i], GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hDevAID != INVALID_HANDLE_VALUE)
{
// Hier das Problem: Dieser Codeabschnitt wird nie Ausgeführt.
ok = GetCommProperties(hDevAID, &commProp);
SetAduComDet(); // Port Details setzen
Befehl[0] = 0x49; // Indendifikationsbefehl
Befehl[1] = 0;
ok = WriteFile(hDevAID, Befehl, strlen(Befehl), (LPDWORD)&x, NULL);
Sleep(WARTE);
ok = ReadFile(hDevAID, &ReadBuffer, 8, charRead, NULL);
//break; // Board Gefunden
}
}
if (hDevAID == INVALID_HANDLE_VALUE) // Nichts angeschlossen
{
return false;
}
strcpy_s(AduPort, _countof(AduPort), port[i]); // Anschluss Merken
return true;
}
Hm...
Damit ist noch nicht gesichert, dass Du da einen und wenn ja, welchen Arduino vorfindest.
Das ist der springende Punkt!
Das geht nur mit dem Ergebnis aus Produkt und Vendor und aktiv.
Und dann muss der angesprochene eine eigene Konfig haben, die bei der obigen Voraussetzung auf Anfrage mit einem eindeutigen Identifer antwortet.
Oder man verlässt sich darauf, dass das Produkt auch in der IDE aktiv ausgewählt ist.
Der Sketch auf dem Arduino ist übrigens:
void setup() {
Serial.begin(9600);
}
//---------------------------------------------------------
void loop() {
if (Serial.available() > 0) {
int inByte = Serial.read();
switch (inByte) {
case 'I':
Serial.print("Arduino");
break;
default:
break;
}
}
}
In den besonderen Fall ist das Sketch auf den Arduino völlig unwichtig.
Du brauchst nur den NAMEN bzw. Vendor-ID damit das Windows-Prg. den findet.
ABER, ich kann dir aus Erfahrung sagen, das viele Programmierer sich den Aufwand nicht machen. Sie (genau wie ich) bieten den User eine Auswahl des COM-Port an, und fragen dann nach ob das Gerät mit ein redet.
Ich habe einige Motorad-Steuersoftware für so Geräte installiert (k.a. was die machen) und da ist es IMMER gleich.
Also mein Tipp: Mach dir nicht so viel Kopf, sondern mache eine Auswahl, und programmiere 1-2 Zeilen Code wodrauf der Arduino anworten soll. Dann noch eine Fehlerabfangroutine (Gerät nicht gefunden) und das war es.
Gruß
Pucki
Hallo,
ich bin einen kleinen Schritt weiter..
Aber ein neues Problem tut sich auf:
In meiner oben geposteten Funktion tut sich Folgendes:
(Ermittelt mit GetLastError())
-
Alle COM-Ports an denen Nichts angeschlossen ist gibt
CreateFile() den Systemfehlercode 2 (
ERROR_PATH_NOT_FOUND) zurück.
Soweit ok und logisch. -
Am Port mit angeschlossenem Arduino bekomme ich jedoch
den Fehlercode 5 ERROR_ACCESS_DENIED zurück. Das
Bedeutet "Zugriff Verweigert" Somit kann ich auch nichts
Lesen/Schreiben.
Aber warum?
( Die Arduino IDE hat ja auch Zugriffsrechte...)
??
Hast Du die IDE / den seriellen Monitor offen?
Gruß Tommy
Hallo Tommy56,
nein, natürlich nicht.
Gruß Klaus
Haben Dir unsere Antworten nicht gefallen, dass Du nebenan die gleiche Frage stellst?
Gruß Tommy
Entschuldige,
aber ich bin halt fast am Verzweifeln...
Und das "Nebenan" so dicht nebenan ist, war mir nicht klar..
Gruß Klaus
Du hast doch genügend Anregungen bekommen, mit denen Du weiter experimentieren kannst.
Wenn Du einen bestimmten Arduino finden willst, wird es wohl eine Frage-Antwort-Folge werden müssen.
Gruß Tommy