Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme USB->Serial Converter (https://www.delphipraxis.net/161-probleme-usb-serial-converter.html)

thomasdrewermann 15. Jun 2002 10:24

Wenn das geht...
Ist ja klasse :D
Aber wenn nicht :(

Aber wie muss ich denn jetzt Portname deklarieren?

jbg 15. Jun 2002 10:25

portname ist ein String.
Ich habe nur einen sehr kleinen Ausschnitt von meinem Code gepostet. Eine zusätzliche DLL sagt mir aber, dass diese direkt auf den Port zugreift. Wenn du willst, kann ich auch die komplette Unit hier posten (ca. 170 Zeilen, von denen ich unnötiges entfernen kann).

thomasdrewermann 15. Jun 2002 10:29

Die Unit greift ja nur auf die DLL zu...
In der sind alle DLL-Funktionen deklariert, damit man nicht in jedem Prog die DLL-Funktionen neu deklarieren muss :D

thomasdrewermann 15. Jun 2002 10:32

Der Compiler mekert über das FPortHandle: "Undefinierter Bezeichner...

Luckie 15. Jun 2002 10:35

Code:
FPortHandle: THandle;

thomasdrewermann 15. Jun 2002 10:35

DANKE :D

jbg 15. Jun 2002 10:36

Das ist auch nicht der komplette Code, den ich oben gepostet habe.

Code:
unit COMPort;
interface
uses Windows, SysUtils, Classes;
type
  TComPortNumber = (ComNone, Com1, Com2, Com3, Com4, Com5, Com6, Com7); // ggf. erweitern
  TComPort = class(TObject)
  private
    FPort: TComPortNumber;
    FPortHandle: THandle;
    Fdcb: TDCB;
    FRaiseOpenException: Boolean;
    procedure SetPort(Value: TComPortNumber);
    procedure SetDCB(const Value: TDCB);
  protected
    function GetHandle: THandle; virtual;
    procedure ClosePort; virtual;
  public
    constructor Create;
    destructor Destroy; override;
    function Write(const buf; size: Cardinal): Cardinal;
    function Read(var buf; size: Cardinal): Cardinal;
    function ClearAll: Boolean; // clears the output and input buffer
    function ClearInput: Boolean; // clears the input buffer
    function ClearOutput: Boolean; // clears the output buffer
    property Port: TComPortNumber read FPort write SetPort;
    property DCB: TDCB read Fdcb write SetDCB;
    property Handle: THandle read GetHandle;
    property RaiseOpenException: Boolean read FRaiseOpenException write FRaiseOpenException;
  end;
const
 // TDCB.Flags
  fBinary          = $0001;  // binary mode, no EOF check
  fParity          = $0002;
  fDtrControlEnable = $0010;  // DTR flow control type
  fRtsControlEnable = $1000;  // RTS flow control enable
implementation
constructor TComPort.Create;
begin
  inherited;
  FPort := ComNone;
  FPortHandle := 0;
  FillChar(Fdcb, SizeOf(Fdcb), 0);
  FRaiseOpenException := False;
end;
destructor TComPort.Destroy;
begin
  ClosePort;
  inherited;
end;
procedure TComPort.ClosePort;
begin
  if FPortHandle <> 0 then begin
    // Port schließen
     CloseHandle(FPortHandle);
     FPortHandle := 0;
  end;
end;
function TComPort.GetHandle: THandle;
var
  commtimeouts: TCommTimeouts;
  portname: String;
begin
  case FPort of
    ComNone: begin
      ClosePort;
      Result := 0;
    end;
    else begin // case else
      if FPortHandle <> 0 then begin
         Result := FPortHandle;
         exit;
      end;
      portname := '\\.\COM' + IntToStr(Integer(FPort));
      FPortHandle := CreateFile(PChar(portname), // name of COM device to open
        GENERIC_READ or GENERIC_WRITE, // read-write access
        0, nil,                       // not used
        OPEN_EXISTING,                // required for tape devices
        0, 0);                        // not used
      Result := FPortHandle;
      if Result = INVALID_HANDLE_VALUE then Result := 0;
      if (FPortHandle <> 0) then begin
        // Device-Parameter setzen
         Fdcb.DCBlength := SizeOf(Fdcb);
         GetCommState(FPortHandle, Fdcb);
          Fdcb.Flags := dcb.Flags and not (fDtrControlEnable or fRtsControlEnable) or fBinary;
          Fdcb.BaudRate := CBR_19200; // baud
          Fdcb.ByteSize := 8;
          Fdcb.Parity := NOPARITY;
          Fdcb.StopBits := ONESTOPBIT;
         SetCommState(FPortHandle, Fdcb);
        // Timeout für ReadFile() setzen
          commtimeouts.ReadIntervalTimeout := 0;
          commtimeouts.ReadTotalTimeoutMultiplier := 5;
          commtimeouts.ReadTotalTimeoutConstant := 100;
         SetCommTimeouts(FPortHandle, commtimeouts);
      end;
      if (Result = 0) and (FRaiseOpenException) then RaiseLastWin32Error;
    end; // case else
  end; // case
end;
procedure TComPort.SetPort(Value: TComPortNumber);
begin
  if Value = FPort then exit;
  FPort := Value;
  ClosePort;
  GetHandle; // Handle erzeugen
end;
procedure TComPort.SetDCB(const Value: TDCB);
var h: THandle;
begin
  h := Handle;
  if h = 0 then exit;
  if SetCommState(h, Value) then begin
     if not GetCommState(h, Fdcb) then Move(Value, Fdcb, SizeOf(Fdcb));
  end;
end;
function TComPort.Write(const buf; size: Cardinal): Cardinal;
begin
  Result := 0;
  if size = 0 then exit;
  if not WriteFile(Handle, buf, size, Result, nil) then Result := -1 * Result;
end;
function TComPort.Read(var buf; size: Cardinal): Cardinal;
begin
  Result := 0;
  if size = 0 then exit;
  if not ReadFile(Handle, buf, size, Result, nil) then Result := -1 * Result;
end;
function TComPort.ClearAll: Boolean; // clears the output and input buffer
begin
  Result := PurgeComm(Handle, PURGE_TXCLEAR or PURGE_RXCLEAR);
end;
function TComPort.ClearInput: Boolean; // clears the input buffer
begin
  Result := PurgeComm(Handle, PURGE_RXCLEAR);
end;
function TComPort.ClearOutput: Boolean; // clears the output buffer
begin
  Result := PurgeComm(Handle, PURGE_TXCLEAR);
end;
end.

thomasdrewermann 15. Jun 2002 10:37

Wie steuer ich jetzt die TXD-LEitung von meinem "Virtuellen"-COM?

jbg 15. Jun 2002 10:44

Schaue dir einmal die TDCB Struktur im PSDK an. Dort müsstest du fündig werden.
Zu setzen der TDCB Struktur:
Code:
// ComPort: TComPort;
var dcb: TDCB;
begin
  dcb := ComPort.DCB;
 // deine Änderungen an der Struktur hier:
  dcb.BaudRate := CBR_2400;

  ComPort.DCB := dcb;
end;

thomasdrewermann 15. Jun 2002 10:49

Irgendwie bin ich immernochnicht schlauer als vorher.
Ich muss die TXD-Leitung seperat ansteuern können.
Ich habe eine Anzege aus der Bochumer U-Bahn hier ligen, und die hat ein sehr merkwürdiges Protokoll: IBIS

Die TXD-Leitung ist immer 1, und so weiter....

Bei meinem Alten Laptop kalppte das alte Prog. auch problemlos, nur an meinem neuen ist kein COM-PORT mehr dran, daher hab ich mir ein USB->Serial converter gekauft.

Nur jetzt lässt sich dieser neue COM-PORT nicht mit meinem alten Prog. ansteuern....


MFG
THOMAS


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Seite 2 von 3     12 3      

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