AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Virtueller COM Port CP210x: Problem unter Win8.1
Thema durchsuchen
Ansicht
Themen-Optionen

Virtueller COM Port CP210x: Problem unter Win8.1

Ein Thema von Rollo62 · begonnen am 22. Jul 2015 · letzter Beitrag vom 23. Jul 2015
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
3.908 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
Horst0815

Registriert seit: 23. Mai 2011
Ort: Görlitz
150 Beiträge
 
Delphi XE Starter
 
#2

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 05:54
benutze diese http://sourceforge.net/projects/comport/

Was ist c?

Statt

Delphi-Quellcode:
 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;
sollte auch reichen

Delphi-Quellcode:
  
  Format(c,'\\.\COM%d',[FCOMPort]);
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#3

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 07:30
danke für den Tip.
ComPort hatte ich mir vor Jahren schonmal angeschaut, werde ich mir auf jeden Fall mal in der aktuellen Version ansehen.

Ich glaube ich habe schon ein mögliches Problem gefunden, es gibt einen dieser vergessenen CompilerSchalter
Code:
{$IFDEF VER200} {$DEFINE NEWDELPHI} {$ENDIF}  { BDS 2009 }
//S4: Added
{$IF CompilerVersion >= 20.0} {$DEFINE NEWDELPHI} {$ENDIF}  { XE+ }  // Added
{$IFDEF FPC}    {$MODE DELPHI}      {$ENDIF}  { Lazarus }
Der war aber schon vorher hart auf NEWDELHPI gesetzt, deshalb hat es vorher auch schon funktioniert.

Das wird dann hier so eingesetzt:
Code:
  {$IFDEF NEWDELPHI}
  c : array[0..63] of WideChar; // <-- hier kommt er vorbei
  {$ELSE}
  c : array[0..63] of char;
  {$ENDIF}
Jedenfalls ann alle die auch noch die Toolbox Serial-Library im Einsatz haben:
- Mal nach NEWDELPHI schauen



!! Trotzdem funktioniert es noch nicht (genausowenig wie in AsyncPro).
Das Problem scheint tiefer zu liegen, denn CreateFile() lässt sich einfach nicht verbinden.
Der COM-Port ist sichtbar und OK im GeräteManager.

Ich habe ja XE8 im Verdacht, weil ich da schon andere Seltsamkeiten gesehen habe.

Hat sie vielleicht etwas an CreateFile geändert ?

Die XE8 Defines sind bei mir so definiert:
Code:
  GENERIC_READ            = DWORD($80000000);
  {$EXTERNALSYM GENERIC_READ}
  GENERIC_WRITE           = $40000000;
  {$EXTERNALSYM GENERIC_WRITE}

  OPEN_EXISTING = 3;
  {$EXTERNALSYM OPEN_EXISTING}

  FILE_ATTRIBUTE_NORMAL              = $00000080;
  {$EXTERNALSYM FILE_ATTRIBUTE_NORMAL}

  FILE_FLAG_OVERLAPPED = $40000000;
  {$EXTERNALSYM FILE_FLAG_OVERLAPPED}

{$IFDEF MSWINDOWS}
  FixedInt = LongInt;
  FixedUInt = LongWord;
{$ENDIF}
{$IFDEF POSIX}
  FixedInt = Integer;
  FixedUInt = Cardinal;
{$ENDIF}


  DWORD = FixedUInt;
  {$EXTERNALSYM DWORD}

  DWORD = System.Types.DWORD;
  {$EXTERNALSYM DWORD}
Da sehe ich auch keine Fehler.

Übrigens scheint die ComPort-Komponente das gleiche zu machen:
Da sehe ich prinzipiell keinen Unterschied bei allen drei Lösungen, sondern eher bei CreateFile selbst.

Code:
// create handle to serial port
procedure TCustomComPort.CreateHandle;
begin
  FHandle := CreateFile(
    PChar('\\.\' + FPort),
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    0);

  if FHandle = INVALID_HANDLE_VALUE then
    //raise EComPort.Create
    CallException(CError_OpenFailed, GetLastError);
end;

Rollo
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 08:25
neben FTDI verwenden wir auch diese USB <-> serial Wandler ganz normal.

Wenn im Gerätemanager alles OK angezeigt und nach einem echtem VM Neustart (nicht nur Suspend) es immer noch nicht will deutet das eher auf einen bereits belegten ComPort hin.
Bei einem VM System Fusion/Workstation/ESXi kann der ComPort auch "shared" zwischen Host&Client sein... sauber VM-USB-Only ist es da nur, wenn im HostUSB der ComPort nicht mehr angezeigt wird.

Also einfach mal TerraTerm oder ein beliebiges anderes Terminalprogramm starten und dort den Port auswählen und öffnen. Dann Ausgaben machen und "irgendwie" prüfen ob was raus geht oder was reinkommt angezeigt wird.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#5

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 09:08
Hallo mensch72,

ja, das habe ich auch ausprobiert.
Ist es leider auch nicht.

Es sollte dann bei belegtem Port eine andere Meldung von CreateFile zurückkommen (nicht ErrorCode 2, so wie jetzt).

Aber nochmal zur Sicherheit:
Womit finde ich denn 100% sicher raus ob ein Port belegt ist oder nicht ?

EDIT:
TeraTerm scheint auch CreateFile zu benutzen
clipboard01.jpg


Rollo

Geändert von Rollo62 (23. Jul 2015 um 09:17 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 09:19
Ich weiß nicht wie er es macht, aber Process Explorer kann dir anzeigen welcher Prozess welchen COM-Port belegt (http://superuser.com/q/55334)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#7

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 09:27
Hallo Günther,

sehr schöner Tip, gut zu wissen

Hier noch mehr Details.

Aber leider war es das auch nicht, bei mir ist nichts belegt ...
clipboard02.jpg
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#8

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 09:56
Hallo mensch72,

ich habe auch versucht Einstellungen wie "shared" für virtuelle USB Ports umzustellen,
habe aber leider nichts gefunden.

clipboard04.jpg

Wie macht man denn soetwas, in den Einstellungen von VmWare Fusion scheint nichts dergleichen drinzusein.

Grosse Hoffnung habe ich aber nicht, denn das hat ja in der Vm, mit gleichen Einstellungen unter XE7 auch funktioniert.

Rollo
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#9

AW: Virtueller COM Port CP210x: Problem unter Win8.1

  Alt 23. Jul 2015, 11:14
wenn auch TerraTerm den Comport nicht auf bekommt, liegt es NICHT an Delphi, egal ob XE7 oder XE8! (ich wette da zu 99% das auch eine alte noch mit XE7 übersetzte exe jetzt nicht in dieser Kombi aus Win8.1, VM und Fusion als Host läuft.

Daher StepByStep erstmal am Host ohne VM einen Connect hinbekommen. Fusion... heißt MacOSx als Host... also dort ein Termnalprogramm mal auf den ComPort loslassen und schaun das dort ein Open samt irgendeiner Datenübertragung klappt.

Wenn das OK, dann weiter mit einer kleinen CleanVM wo nur TerraTerm drin ist...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz