Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.917 Beiträge
 
Delphi 12 Athens
 
#1

Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 22. Jul 2015, 22:11
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

Geändert von Rollo62 (22. Jul 2015 um 22:15 Uhr)
  Mit Zitat antworten Zitat