Registriert seit: 31. Aug 2015
5 Beiträge
Delphi XE8 Professional
|
Übersetzung von C nach Delphi (IOCTL)
22. Dez 2015, 10:17
Morgen zusammen,
Ich musste den folgenden C-Code nach Delphi portieren, um den GPIO-Baustein anzusprechen.
C-Headerdatei:
Code:
/* Device type
#define GPIO_IOCTL_TYPE 0x9000
#define IOCTL_GPIO_WRITE \
CTL_CODE( GPIO_IOCTL_TYPE, 0x901, METHOD_OUT_DIRECT , FILE_ANY_ACCESS)
#define IOCTL_GPIO_DIRECTION \
CTL_CODE( GPIO_IOCTL_TYPE, 0x902, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define ...
Typedef Enum
{
CONNECT_MODE_INVALID = 0,
CONNECT_MODE_INPUT,
CONNECT_MODE_OUTPUT,
CONNECT_MODE_MAXIMUM = CONNECT_MODE_OUTPUT
} GPIO_CONNECT_IO_PINS_MODE;
typedef struct
{
ULONG pin;
union
{
ULONG data_B;
GPIO_CONNECT_IO_PINS_MODE ConnectMode;
} ABC;
} GPIO_PIN_PARAMS, *PGPIO_PIN_PARAMS;
Ich habe das so übersetzt:
Daraus ergibt sich dann in Delphi folgendes ?
Delphi-Quellcode:
const
GPIO_IOCTL_TYPE = $9000;
GPIO_Device ='\\.\DEVICE';//Name
IOCTL_GPIO_WRITE = DWORD((GPIO_IOCTL_TYPE shl 16) or (2 shl 14) or ($901 shl 2) or 0);
IOCTL_GPIO_DIRECTION = DWORD((GPIO_IOCTL_TYPE shl 16) or (2 shl 14) or ($902 shl 2) or 0);
//...
(* ----------------------------------------------------------- *)
Type // Typedef Enum
_GPIO_Connect_IO_PINS_MODE = (
CONNECT_MODE_INVALID = 0,
CONNECT_MODE_INPUT,
CONNECT_MODE_OUTPUT,
CONNECT_MODE_MAXIMUM = CONNECT_MODE_OUTPUT
);
GPIO_Connect_IO_PINS_MODE = _GPIO_Connect_IO_PINS_MODE;
(* ----------------------------------------------------------- *)
Type
C_Enum =(Var_Cardinal, Var_GPIO);
(* ----------------------------------------------------------- *)
Type
PABC = ^TABC;
TABC = Record
case _Pin : C_Enum of
Var_Cardinal :(data_B: Cardinal);
Var_GPIO :(Var_ConnectMode: _GPIO_Connect_IO_PINS_MODE);
end;
(* ----------------------------------------------------------- *)
Type // TypeDef struct
PPGIO_PARAMS = ^TPGIO_PARAMS;
TPGIO_PARAMS = record
Pin : Cardinal;
ABC : TABC;
end;
Da der Zugriff (auf die GPIO-Schnittstelle) nicht funktioniert, wollte ich erstmal fragen ob meine Übersetzung stimmt??
Ich möchte einen Pin (z.B: 1) als Ausgang konfigurieren und ihn dann setzen:
Die Procedure sieht dann so aus:
Delphi-Quellcode:
var
frmMain : TfrmMain;
DeviceHandle : THandle;
Params : TPGIO_PARAMS;
nReturn : DWORD;
procedure TfrmMain.Button1Click(Sender: TObject);
begin
DeviceHandle := CreateFile(Pchar(GPIO_Device), GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR
FILE_SHARE_WRITE, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR
FILE_FLAG_NO_BUFFERING, 0);
if DeviceHandle <> INVALID_HANDLE_VALUE then
begin
//Konfiguration (Direction): Output
Params.Pin := 1; //Pin 1
Params.ABC.Var_ConnectMode := Connect_Mode_OutPut; //Pin Direction is set to Output
DeviceIoControl(DeviceHandle, IOCTL_GPIO_DIRECTION, @Params, SizeOf(Params), Nil, 0, nReturn, nil);
//Zugriff :Write
Params.ABC.Data_B := 0;//255 // Hier bin ich mir nicht sicher, was ich hier eingeben muss ???
Params.Pin := 1;
DeviceIoControl(DeviceHandle, IOCTL_GPIO_Write, @Params, SizeOf(Params), Nil, 0, nReturn, nil);
CloseHandle(DriveHandle);
end
else
begin
MessageDlg('Error!', mtWarning, [mbOK], 0);
end;
end;
Der Compiler bringt keine Fehlermeldung, aber es funktioniert nicht..
Danke schonmal im Voraus für die Hilfe
Geändert von Rads (22. Dez 2015 um 10:24 Uhr)
|