Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi 64Bit OS -> serielle Schnittstelle benutzen (https://www.delphipraxis.net/146011-64bit-os-serielle-schnittstelle-benutzen.html)

AJ_Oldendorf 12. Jan 2010 08:43


64Bit OS -> serielle Schnittstelle benutzen
 
Hallo zusammen,
ich habe eine Frage bezüglich der seriellen Schnittstelle bei einem 64bit OS.
Die Software läuft auf Win200, WinXP, WinVista und Win7 unter 32bit problemlos.
Es ist einfach nur ein Softwaretool um über die serielle Schnittstelle zu "reden". Es werden auch Overlapped Events benutzt.
Nur leider wollte ich das jetzt auf einem Win7 64bit testen (gleiche Exe die unter 32bit läuft) und da bekomme ich keine Kommunikation über die Serielle Schnittstelle hin.
Hat damit jemand schonmal Erfahrungen gehabt bzw Anregungen?

Viele Grüße
Alex

Luckie 12. Jan 2010 08:45

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Da wird wohl nur ein 32-Bit Treiber dabei sein. Für ein 64-Bit OS brauchst du aber einen 64-Bit Treiber.

AJ_Oldendorf 12. Jan 2010 09:14

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Die serielle Schnittstelle läuft ja ganz normal wenn ich im Windows was teste. Nur mit der eigenen Software funktioniert es bei dem 64bit OS nicht. Oder habe ich da mit dem Treiber irgendwas falsch verstanden?!
Viele Grüße
Alex

Bernhard Geyer 12. Jan 2010 09:28

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Ist es eine eigene SW oder eine Kaufsoftware?
Falls eigen SW - Welche Kompos verwenden verwendet?

AJ_Oldendorf 12. Jan 2010 09:34

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Eigene Software die aber wie gesagt auf 32bit System läuft. Ich arbeite einfach nur mit CreateFile um den ComPort zu öffnen und dann wie hier überall im Forum beschrieben wird den ComPort lesen bzw. schreiben.

Viele Grüße
Alex

Bernhard Geyer 12. Jan 2010 10:40

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Du könntest ja mal versuchen mit einer der noch gepflegten COM-Kommunikationskomponenten zu arbeiten.

AJ_Oldendorf 12. Jan 2010 12:49

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
So wird der ComPort initialisiert und die Overlapped Struktur erzeugt.

Delphi-Quellcode:
  StrPCopy (NullStr, FPort);
  SerHandle   := CreateFileA (NullStr, Generic_Read or Generic_Write, 0, Nil,
                              Open_Existing,
                              FILE_FLAG_OVERLAPPED, 0);
  if SerHandle <> INVALID_HANDLE_VALUE then
  begin

    if SetupComm (SerHandle, InBuffer, OutBuffer) then
    begin
      FillChar (DCB, SizeOf(DCB), 0);
      DCB.DCBlength := SizeOf (DCB);
      DCB.BaudRate  := Baud;
      DCB.Flags     := $0001;
      DCB.Parity    := Ord (Parity);
      DCB.ByteSize  := ByteSize;
      DCB.StopBits  := Ord (StopBits);
      DCB.EvtChar   := RXFlagChar;

      if SetCommState (SerHandle, DCB) then
      begin
        With CommTimeOuts do
        begin                                 { TimeOut's setzen         }
         
        end;
        if SetCommTimeouts(SerHandle, CommTimeOuts) then
        begin
          if RTSCTS = Ja then                 { Hardwarehandshake         }
          begin
            EscapeCommFunction(SerHandle, SETRTS);
            EscapeCommFunction(SerHandle, SETDTR);
          end;
          Case RXEvent of                     { Eventmaske setzen         }
            RXChar  : TmpMask := EV_RXCHAR;  
            RXFlag  : TmpMask := EV_RXFLAG;  
            RXRing  : TmpMask := EV_RING;
            RXCTS   : TmpMask := EV_CTS;
            RXDSR   : TmpMask := EV_DSR;
            else      TmpMask := 0;
          end;

          if SetCommMask(SerHandle, TmpMask) then
          begin
            StrPCopy (NullStr, 'Read_Test');
            rOverlapped.hEvent := CreateEventA (NIL,      { Security attr.  }
                                               True,      { Manuel reset ??  }
                                               False,     { Signaled ??      }
                                               NullStr);  { Signif.name     }
            StrPCopy (NullStr, 'Write_Test');
            wOverlapped.hEvent := CreateEventA (NIL,      { Security attr.  }
                                               True,      { Manuel reset ??  }
                                               False,     { Signaled ??      }
                                               NullStr);  { Signif.name     }
            if (rOverlapped.hEvent <> Null) and
               (wOverlapped.hEvent <> Null) then
            begin
              Success     := True;
             
            end;
          end;
        end;
      end;
    end;
  end
  else
  begin
    ErrorCode := GetLastError;
  end;
Erwähnenswert ist jetzt noch, dass der Empfang über die Serielle Schnittstelle Asynchron erfolgt.

Delphi-Quellcode:
ReadFile (SerHandle, ReceiveBuffer, InBuffer div 2,
          ReceivedBytes, @rOverlapped);
Dann wartet ein Thread auf Signalisierung in der Overlapped Struktur und arbeitet danach die empfangenen Daten ab.

Das funktioniert laut Debugger noch alles (er kommt überall rein) aber es scheinen nur die ersten 3 Bytes der empfangenen Daten gültig zu sein. Die Länge der Daten stimmt auch noch aber der Dateninhalt ab Byte 3 passt nicht mehr... Hat da jemand eine Idee zu?

Viele Grüße
Alex

Luckie 12. Jan 2010 12:51

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Braucht man für den COM-Port keinen Treiber? Und der Zugriff funktioniert auch mit eingeschränkten Benutzerrechten?

AJ_Oldendorf 12. Jan 2010 12:53

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Ich denke nicht, dass ich da ein extra Treiber brauche...
Korrigiert mich, falls ich falsch denke...
Adminrechte sind verfügbar. Wie gesagt, es geht auf alle Maschinen mit 32bit nur 64bit eben nicht...

Hab grad ComPortLib hier im Forum gefunden und mir angeguckt.
Da wird auch mit Overlapped Events gearbeitet nur steht da extra schon im Source überall Win32 drinne... Das deutet doch schon auf eine Änderung bei 64bit hin...

Luckie 12. Jan 2010 12:59

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Denk dran, dass du unter Windows 7 nicht automatisch Administratorenrechte hast, auch wenn du über das Administratorenkonto angemeldet bist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.
Seite 1 von 3  1 23      

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