Delphi-PRAXiS

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.

AJ_Oldendorf 12. Jan 2010 13:01

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Ok, ich werde mir das mit den Adminrechten mal angucken aber mal ehrlich, geht dann der empfang der seriellen Schnittstelle nur bis Byte 3 wenn man eingeschränkte Rechte evtl. hat?
Kann ich mir nur schwer vorstellen...
Wo sehe ich denn am besten, ob ich wirklich Adminrechte habe?

Viele Grüße
Alex

Astat 12. Jan 2010 13:50

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Zitat:

Zitat von AJ_Oldendorf
Ok, ich werde mir das mit den Adminrechten mal angucken aber mal ehrlich, geht dann der empfang der seriellen Schnittstelle nur bis Byte 3 wenn man eingeschränkte Rechte evtl. hat?
Kann ich mir nur schwer vorstellen...
Wo sehe ich denn am besten, ob ich wirklich Adminrechte habe?

Viele Grüße
Alex


Hallo AJ_Oldendorf, das Problem ist, Du arbeitest mit einem 64 Treiber, dieser wird mit
Delphi-Quellcode:
CreateFileA (NullStr,
verwendet. Nun ist dieser Treiber jedoch 64 Bit, und Du greifst mit einer 32 Bit Applikation drauf zu.

Also 32 Bit Treiber 32 BIt Software, 64 Bit Treiber 64 Bit Software.

Möglichkeit, die Comports Sourcen mit FPC 64 Bit compilieren.

Lazarus bietet eine dementsprechende 64 BIt IDE

lg. Astat

Muetze1 12. Jan 2010 14:09

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Der Treiber für den seriellen Port ist sowas von egal - also selbst das OS ist egal ob es 32 oder 64 Bit ist. Wenn er einen COM Port öffnet mit \\.\COMxx und CreateFile(), dann kann er den öffnen. Dabei ist die WinAPI immer die passende - bei einer 32 Bit Anwendung auf einem 64 Bit OS halt der Win32 Layer. Da gibt es grundlegend keine Unterschiede und keine Besonderheiten.

Ich nutze selbst die serielle Schnittstelle und entwickle sogar unter einem 64 Bit Windows mit 32 Bit Delphi eine 32 Bit Windows Anwendung und die läuft komplett ohne Admin Rechte. Selbst Delphi braucht für seinen Debugger bei seiner eigenen Tochterprozess die UAC zu befragen, das geht so.

Grundlegend würde ich bei der Overlapped Methode vor allem alle Rückgabewerte der WinAPI Funktionen beobachten und schauen ob du dort entsprechende Fehlerhinweise bekommst. Meine serielle Kommunikation ist simpel gehalten: In einem zentralen Thread wird die I/O gehandhabt Sleep und GetCommState() um zu schauen ob Daten anliegen. Da du bei OVERLAPPED ja Events und ähnliches anlegen musst, hast du schonmal deren Anlegung geprüft und verfolgt? Vor allem Rückgabewerte beachten...

AJ_Oldendorf 12. Jan 2010 14:16

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Ich war grad schon erschrocken, dass es wirklich so sein sollte wegen dem 64Bit Treiber und 32Bit Delphi usw. Das konnte ich mir nicht vorstellen und danke Muetze1 dass du mir das bestätigt hast.

Ja, die Events werde alle sauber angelegt und bearbeitet.
Das komische ist ja, dass nur die ersten 2 Bytes in den ReceivedBytes richtig sind (ich weiß was an Daten kommen müsste) und ab dem 3ten Byte steht nur noch "Mist" drinne...
Habe gerade den Test auch unter Vista 64bit gemacht. Da gehts auch nicht.

Also:

Vista 64 bit, Win7 64 bit -> funktioniert nicht (-> Datenmüll)
Win200, Win XP, Win Vista, Win7 (alle 32 bit) -> funktionieren

Astat 12. Jan 2010 15:16

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Zitat:

Zitat von Muetze1
- bei einer 32 Bit Anwendung auf einem 64 Bit OS halt der Win32 Layer.

Jupp, Mein Fehler Sorry.

lg. Astat

Muetze1 12. Jan 2010 19:28

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Zitat:

Zitat von Astat
Jupp, Mein Fehler Sorry.

Kein Problem, aber ich wollte AJ_Oldendorf nicht in seinem Schweiße baden lassen...

Zitat:

Zitat von AJ_Oldendorf
Vista 64 bit, Win7 64 bit -> funktioniert nicht (-&gt; Datenmüll)
Win200, Win XP, Win Vista, Win7 (alle 32 bit) -&gt; funktionieren

Könntest du vllt. ein Kopie des Projektes machen und mal den ganzen OVERLAPPED Kram rauswerfen und das rein threadbasierend machen? Grundlegend ist der OVERLAPPED Zugriff ein wenig komplizierter und es könnten sich dort ungewollt Fehler verstecken die entweder durch den Win32 Layer hervortreten oder doch sogar durch ihn verursacht werden.

(Kopie, weil das nur ein Test ist. Ich habe mich bisher immer um das OVERLAPPED gedrückt und bin bisher immer gut gefahren. Meine Anwendungen haben bisher auch keine Probleme auf den von dir aufgezählten Systemen)

Ansonsten hast du auch schonmal mit dem PortMonitor von SysInternals die Kommunikation betrachtet? Kommen dort alle Daten richtig an bzw. vermeldet er dort irgendwelche fehlgeschlagenen Aufrufe zu deinem Prozess?

AJ_Oldendorf 13. Jan 2010 07:35

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Danke erstmal für deine Anregungen.
Das alles rauszunehmen wird ein haufen Arbeit. Muss ich mal prüfen ob das so einfach geht.
Allerdings kommt mir langsam der Eindruck, dass noch niemand mit Overlapped Strukturen gearbeitet hat auf einer 64bit Plattform.
Da es bei allen 32bit Plattformen funktioniert, denke ich fast mal, dass doch ein Fehler beim Win32 Layer vorliegt.
Wisst ihr, wo ich evtl. auf einer Microsoft Seite (kann auch englisch sein) ein entsprechenden Eintrag machen kann, sodass sich vielleicht jemand diesem Problem annimmt? (knowledge base)

Den PortMonitor von SysInternals gucke ich mir mal an. Habe ich noch keine Erfahrung mit.

Viele Grüße
Alex

Muetze1 13. Jan 2010 08:55

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Die Async Professional nutzt auch die Overlapped Methode. Da dein Programm anscheinend sehr umfangreich ist, könntest du erstmal das Demoprogramm von Async Professional nutzen bzw. dir eins zusammen bauen. Wenn dies auch das Problem hat, dann ist wohl MS Schuld, ansonsten deine Implementierung. Grundlegend ist die Wahrscheinlichkeit eines Fehler im Win32 Layer recht gering, weil ansonsten müssten viele namenhafte Hersteller schon Probleme vermeldet haben. Die ComPort Library ist auch eine Delphi Komponente welche die Overlapped Struktur nutzt. Diese hat auch Examples mit bei und kann zum generellen Test genutzt werden.

AJ_Oldendorf 13. Jan 2010 09:31

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Hab mir mal die ComPort Library angeguckt und eine Exe erzeugt.
Nur wie kann man da in dem Terminalfenster einen String eingeben damit dieser an die serielle Schnittstelle geschickt wird?
Sehe ich dann auch, was zurück kam von der Schnittstelle?
Irgendwie erschließt sich das Programm mir nicht ganz...

Viele Grüße
Alex

Muetze1 13. Jan 2010 13:02

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Also unter Examples\Delphi\ gibt es ein ComExample.dpr Projekt. Dieses hat ein großes Memo welches die empfangenen Zeichen darstellt und rechts ein TEdit mit dem Send Button zum Senden von Daten an die Schnittstelle. Ich habe Version 3.10 geladen, da ich kein D2010 derzeit nutze und somit die Anpassung an dieses nicht benötige.

AJ_Oldendorf 13. Jan 2010 13:12

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Ok danke, das hatte ich irgendwie übersehen. Hab die Exe jetzt am laufen und werde das mal testen.
Danke und viele Grüße
Alex

AJ_Oldendorf 20. Jan 2010 08:05

Re: 64Bit OS -> serielle Schnittstelle benutzen
 
Es liegt anscheind doch nicht am 64bit Windows!!!
Ich habe jetzt noch ein anderen Rechner auftreiben können mit Windows 7 64bit und da funktioniert die Software.
Die zwei Rechner, mit denen ich getestet habe (wo die Software nicht ging), sind beide von Siemens und genau das gleiche Model.
Eventuell ist da ein Problem mit dem Chipsatz oder wie auch immer.

PC 1 hat Vista 64 bit -> Software läuft nicht
PC 2 hat Win7 64bit -> Software läuft nicht

Wie gesagt, es sind genau die gleichen Laptop Modelle.
Ich will jetzt erstmal keine Namen nennen damit ich erstmal an Siemens ran treten kann.

Mit einem komplett anderen PC und einem 64bit System läuft es.
Also ich werde jetzt mal Kontakt mit Siemens aufnehmen.

Danke trotzdem für alle Tips und Ideen.
Viele Grüße
Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 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