AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi 64Bit OS -> serielle Schnittstelle benutzen
Thema durchsuchen
Ansicht
Themen-Optionen

64Bit OS -> serielle Schnittstelle benutzen

Ein Thema von AJ_Oldendorf · begonnen am 12. Jan 2010 · letzter Beitrag vom 20. Jan 2010
Antwort Antwort
Seite 1 von 3  1 23      
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#1

64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 09:43
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 09:45
Da wird wohl nur ein 32-Bit Treiber dabei sein. Für ein 64-Bit OS brauchst du aber einen 64-Bit Treiber.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#3

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 10:14
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 10:28
Ist es eine eigene SW oder eine Kaufsoftware?
Falls eigen SW - Welche Kompos verwenden verwendet?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#5

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 10:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 11:40
Du könntest ja mal versuchen mit einer der noch gepflegten COM-Kommunikationskomponenten zu arbeiten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#7

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 13:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 13:51
Braucht man für den COM-Port keinen Treiber? Und der Zugriff funktioniert auch mit eingeschränkten Benutzerrechten?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#9

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 13:53
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...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: 64Bit OS -> serielle Schnittstelle benutzen

  Alt 12. Jan 2010, 13:59
Denk dran, dass du unter Windows 7 nicht automatisch Administratorenrechte hast, auch wenn du über das Administratorenkonto angemeldet bist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 18:30 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