Die Init-Funktion ist so definiert:
Code:
int _VI_FUNC bp4422_init(int ,int,double,int,int,int,char*,int,int *);
Also ist es kein
var instrumentIDString: PChar
sondern nur
instrumentIDString: PChar
, den du
imho nicht initialisieren musst.
Das gleiche Problem hast du beim letzten Parameter: da reicht ein
var instrumentID : Integer
Durch das
var
wird der Parameter automatisch als Pointer übergeben.
Dankeschön jetzt hat es funktioniert!!
So Folgendes jetzt möchte ich einen (z.Beispiel 20.5° C) Wert auslesen dazu benutze ich die Funktionenen
bp4422_start_measure
(klappt auch mit der instid alles),
bp4422_read_measure_string
(funzt aber problem mit dem zurück geben des Value Werts(das ist der Temp wert)), und zum stoppen
bp4422_stop_measure
(funzt auch) , danach dann close
Com (funzt auch)
deklaration der Funktionen:
Delphi-Quellcode:
function bp4422_init(COMPort: integer; baudRate: integer; timeout_seconds: double; blockCheck: integer;
groupAddress: integer; userAddress: integer; var instrumentIDString: Char; resetDevice: integer;
var instrumentID: integer): integer; stdcall; external DLLNAME; // Init: habe ich jetzt verändert, so wie du meinstest nur das var sozusagen gelassen bei den pointern
function bp4422_start_measure(instrumentID: integer; typek: integer): integer; stdcall; external DLLNAME; // START Messen
function bp4422_read_measure_string(instrumentID: integer; var value: char): integer; stdcall; external DLLNAME; // Lese Temp - Wert aus
function bp4422_stop_measure(instrumentID: integer): integer; stdcall; external DLLNAME;stdcall; external DLLNAME; // STOP Messen
function bp4422_close(instrumentID: integer): integer; stdcall; external DLLNAME; //zum Schließen des Ports
Aufruf:
Delphi-Quellcode:
procedure Tfrm_c4SU.Button9Click(Sender: TObject);
var
error: integer;
instidstring: Char;
instid: integer;
value: char;
begin
try
error := bp4422_init(4,9600,2,0,0,0,instidstring,0,instid);
//
error := bp4422_start_measure(instid, 3);
//instid hat den wert 1 was auch richtig ist
error := bp4422_read_measure_string(instid, value);
// value nimmt hier den Wert - an weil mein Messgerät momentan -7° liest, theoretisch ist das ja richtig weil er die erste stelle also nimmt, aber ich brauche 4-5 stellen weil er ja auch 23,5° lesen soll ect. aber in der dll ist value ja als *char angegeben. Wenn ich beides in der Deklaration der Funktion und im Aufruf hier unten auf string setze anstatt char ist der Wert Value beim debuggen nicht verfügbar (mit char steht ein - bei value) //(allerdings ändert sich hier die instid wieder auf irgendeine andere Zahl Beispiel 94516351 oder 0 deshalb das folgende instid :=1) warum die sich ändert weiss ich nicht
ShowMessage(value);
instid:= 1;
error := bp4422_stop_measure(instid);
error := bp4422_close(instid);
except
error := bp4422_close(instid);
end;
// HIER KOMMT IMMERNOCH DER ZUGRIFFSFEHLER nach dem ich beim debuggen hier weiterklicke
end;
in der .C datei steht die funktion read string ja so da:
int _VI_FUNC bp4422_read_measure_string(int instrID,char *value )
und in delphi wenn ich die bp4422.DLL öffne sehe ich bei parametern der funktion
bp4422_read_measure_string
instrID als int (in) und value als LPSTR (in,out)