Nutzung FTDI-Modul

Beim Aufruf des FTDI-Moduls bekomme ich z.B. bei den Funktionen GetDevices und GetPort die Exception, das wäre vom FTDI-Treiber nicht unterstützt. Die gleichartigen Aufrufe über die FTDI-API funktionieren jedoch.
Ich verwende die Treiber aus dem WS300 WeatherProfessional-Packet. (3.1.7)
Ziel soll sein, nach dem bekannten DeviceString zu suchen und dieses Gerät zu öffnen.

Hat jemand irgendwelche Tipps?

Danke!
Tommi

Kannst du mir eine genaue Fehlermeldung geben? Es sollte eigentlich funktionieren. GetPort dürfte gar keine Fehler melden.

Hast du vielleicht eine GetDTR oder GetRTS irgendwo vorher? Diese Funktion unterstützt FTDI nämlich wirklich nicht.

paresy

Hallo,
hier ist der verwendete Code mit Bemerkung, wo es daneben geht. Die Meldung „EIPSFTDI Not supported by FTDI-Driver“
Tommi


var parent:IIPSModule;

    ftdidev:TFTDIDevice;
    ftdidevs:TFTDIDevices;
    desc,serial:string;
   CONST ELV_STRING='eQ3 WS 300 PC II';
begin
if fKernel.DataHandler.GetInstanceParentID(fInstanceID) > 0 then parent:=getParent();
 if parent=NIL then exit;

 if supports(parent,IIPSFTDI,ftdi) then
 begin

    ftdi.setopen(true); //muss erst aktiv sein, sonst geht gar nichts
    ftdidevs:=ftdi.GetDevices(); //bringt EIPSFTDI
     //desc:=ftdi.GetPort; //geht auch nicht
    for ftdidev in  ftdidevs do
    begin
      desc:=ftdidev.Description;
      if (desc=ELV_STRING) then
      begin
         if not ftdidev.InUse then
         begin
           serial:=ftdidev.SerialNumber;
           if fchangedsettings.DeviceID='' then fchangedsettings.DeviceID:=serial;
           if fchangedsettings.DeviceID=serial then break;
         end;
      end;

    end;
    
 end;
 fCurrentSettings := fChangedSettings;
 fKernel.TimerPoolEx.SetInterval(fTimerUpdate, fCurrentSettings.Interval);
 inherited;
 syncParent;
end;

Guck mal bitte ob deine IIPSFTDI Definition richtig ist. Vielleicht ist im SDK eine zu alte, sodass die Sprungadressen falsch berechnet werden.


 IIPSSerialControl = interface(IInvokable)
  ['{62351C4A-1947-4AEA-A3F3-8FA85D22C960}']
  procedure SetBaudRate(BaudRate: String); stdcall;
  procedure SetStopBits(StopBits: String); stdcall;
  procedure SetDataBits(DataBits: String); stdcall;
  procedure SetParity(Parity: String); stdcall;
//  procedure SetFlowControl(FlowControl: String); stdcall;
  function GetBaudRate: String; stdcall;
  function GetStopBits: String; stdcall;
  function GetDataBits: String; stdcall;
  function GetParity: String; stdcall;
//  function GetFlowControl: String; stdcall;
 end;

 IIPSSerialControlEx = interface(IIPSSerialControl)
  ['{2A35E181-2562-433F-9F61-2C169EF6CA80}']
  procedure SetDTR(OnOff: Boolean); stdcall;
  procedure SetRTS(OnOff: Boolean); stdcall;
  procedure SetBreak(OnOff: Boolean); stdcall;
  function GetDTR: Boolean; stdcall;
  function GetRTS: Boolean; stdcall;
 end;

 IIPSFTDI = interface(IIPSSerialControlEx)
  ['{C1D478E9-2A3E-4344-BCC4-37C892F58751}']
  procedure SetOpen(Open: Boolean); stdcall;
  procedure SetPort(Port: String); stdcall;
  function GetOpen: Boolean; stdcall;
  function GetPort: String; stdcall;
  //Actions
  function GetDevices: TFTDIDevices; stdcall;
  procedure SendText(Text: String); stdcall;
 end;

paresy

Die GUIDs stimmen überein.
Der einzige erkennbare Unterschied war das fehlende…ex in der Definition. Aber das hast Du vielleicht erst auf meinen FeatureRequest eingebaut.

IIPSFTDI = interface(IIPSSerialControl)

Tommi

Ich habe die alten .dcu-Files entsorgt, neu kompiliert und schon geht es.
Verstehen tue ich es aber nicht.:confused:

Danke!
Tommi