Hallo zusammen,
ich portiere gerade eines meiner Projekte von XE7 zu XE8 Upd1, und arbeite
unter VmWare Fusion 7.1.2 (aktuell) und Win8.1 64Bit (aktuell), ich habe
Silabs CP210x V6.7 64-Bit Treiber installiert (aktuell 8.1).
Plötzlich scheint der
COM-Port Zugriff nicht mehr zu laufen, das ging immer bis zur jetzigen Version, und
ich habe eigentlich keine Änderung am Sourcecode gemacht.
Es passiert Folgendes:
- Wenn das Gerät eingesteckt wird, wird auch der
COM-Port im Gerätemanager angezeigt: OK
- Wenn ich mich damit verbinden will dann hakt es bei dem CreateFile() Aufruf mit ErrorCode 2: "File not available".
- Ich kann den
COM-Port z.B. verschieben von COM3 zu COM11, keine Änderung
- Weil ich der Sache nicht ganz traue habe ich es versucht mit AsyncPro zu Öffnen, geht auch nicht.
(Ich benutze normalerweise eine andere
COM-Port Library, aber beide fliegen bei CreateFile mit INVALID_HANDLE raus)
- Habe versucht Port-nummer zu ändern, neu zu booten, mit anderer USB-Hardware, etc. etc.
Der Port scheint also auch nicht belegt zu sein, denn dann käme eine andere Error-Meldung.
- Unter <= Win7 funktiniert es aber ohne Probleme
- Der Serial-Code ist in zig Projekten ohne Probleme gelaufen.
So sieht es bei mir aus: Es wird < 10 und >= 10
COM-Port Nr. berücksichtigt.
Die Methode >= 10 für einstellige
COM-Ports habe ich aber auch schon unter Win8.1 getestet, weil dies
in manchen Libraries nicht mehr so benutzt wird.
Code:
// Schnittstelle öffnen
if (FCOMPort<10) and True then
begin
c:='COMx'+#0;
c[3]:=chr($30+FCOMPort);
end
else
begin
c:='\\.\COMx'+#0+#0;
c[7]:=chr($30+(FCOMPort div 10));
c[8]:=chr($30+(FCOMPort mod 10));
end;
FSerHandle:=CreateFile( c,
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0);
//S4: Check LastError --> hier fliegt er raus
if (FSerHandle = INVALID_HANDLE_VALUE) then
begin
sErr := S4Err_LastError_AsString(0);
end;
So macht es AsyncPro, das war ein kleiner Test um nur einen Port zu öffnen, hilft aber auch nicht:
Code:
function MakeComName(const Dest : PChar; const ComNum : Cardinal) : PChar;
{-Return a string like 'COMXX'}
begin
StrFmt(Dest,'\\.\
COM%d',[ComNum]);
MakeComName := Dest;
end;
Res := CreateFile(MakeComName(ComName, ComNum),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or
FILE_FLAG_OVERLAPPED,
0);
if Res > 0 then begin
CloseHandle(Res);
Result := True;
end else begin
if ShowPortsInUse then
Result := GetLastError = DWORD(Abs(ecAccessDenied))
else
Result := False;
end;
Das ist sehr seltsam, weil der Code so schon seit Jahren ohne Probleme läuft.
Hatte vielleicht schonmal jemand ähnliche, seltsame Effekte gehabt ?
- liegt es an XE7 --> XE8 Update ?
- liegt es an Win8.1 ?
- liegt es an VmWare ?
- kann es vieleicht an einem fehlenden Manifest oder ähnlichem liegen ?
Ich hoffe hier gibt es noch andere die sich noch mit den guten alten
COM-Ports auseinandersetzen müssen.
Rollo