Funktioniert, Ich hoffe nur der
Com-Port wird, falls er sich aendert auch (schnell genug) aktualisiert.
Nicht perfekt, aber momentan so geloest:
Delphi-Quellcode:
// Find COMport from Windows Registry
Function TFRM_Main.FindArduinoComPort(ArduinoStr : String) : String;
var
KeyNames_L1, KeyNames_L2: TStrings;
L1, L2: integer;
Reg : TRegistry;
Str : String;
COMPort : String;
L_Bracket, R_Bracket : Integer;
begin
// If no Port found return empty string
COMPort := '';
// Initialize StringLists
KeyNames_L1 := TStringList.Create;
KeyNames_L2 := TStringList.Create;
// Initialize Registry
Reg := TRegistry.Create;
// Search for 'Arduino Micro'
with Reg do begin
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly('\SYSTEM\ControlSet001\Enum\USB') then
begin
// Get List of All SubKeys in \SYSTEM\ControlSet001\Enum\USB
KeyNames_L1.Clear;
GetKeyNames(KeyNames_L1);
// Iterate through Level 1
for L1 := 0 to KeyNames_L1.Count-1 do
begin
OpenKeyReadOnly('\SYSTEM\ControlSet001\Enum\USB');
OpenKeyReadOnly(KeyNames_L1[L1]);
// Get List of All SubKeys in \SYSTEM\ControlSet001\Enum\USB\"Level 1"
KeyNames_L2.Clear;
GetKeyNames(KeyNames_L2);
// Iterate through Level 2
for L2 := 0 to KeyNames_L2.Count-1 do
begin
// Open Each Subkey and search for 'FriendlyName' key, then check for 'Arduino Micro'
OpenKeyReadOnly(KeyNames_L2[L2]);
Str := Reg.ReadString('FriendlyName');
if AnsiPos(ArduinoStr, Str) > 0 then
begin
L_Bracket := AnsiPos('(', Str);
R_Bracket := AnsiPos(')', Str);
if (L_Bracket > 0) and (R_Bracket > 0) then
begin
COMPort := AnsiMidStr(Str, L_Bracket+1, R_Bracket - L_Bracket - 1);
end;
end;
end;
end;
end;
finally
CloseKey;
Free;
end;
end;
// Return Result
Result := COMPort;
end;
Uebergeben wird der Device String oder ein Teil davon, in meinem Fall ArduinoStr = 'Arduino Micro'. Zurueckgegeben wird der
COM-Port als String, der ueblicherweise in Klammern hinter dem FriendlyName steht. Gegebenenfalls muessen auch noch tiefere Level der Keys durchsucht werden. Bei mir reicht das zweite Level.
Wenn jemand was eleganteres oder effizienteres hat, dann bitte posten ...
Gutelo