![]() |
Auslesen/Programmieren
Hallo
Ich muss bei einem FT232BM von FTDI unteranderem Daten programmieren und auslesen können. Dazu benutze ich Delphi... Beim Programmieren habe ich keine Probleme, aber dass auslesen ist etwas harziger... Mal den Code zum Programmieren: Die Daten zum Programmieren sind in einem Record.
Delphi-Quellcode:
Beim Auslesen habe ich das hier... aber es stürzt mir immer ab...
ftdata : Record
VendorID : word; ProductID : word; Manufacturer : PChar; ManufacturerID : PChar; Description : PChar; SerialNumber : PChar; MaxPower : word; PnP : Word; SelfPowered : Word; RemoteWakeup : Word; Rev4 : boolean; IsoIn : boolean; IsoOut : boolean; PullDownEnable : boolean; SerNumEnable : boolean; USBVersionEnable : boolean; USBVersion : Word; FT_EE_Program(Multi_Handle,@FtData);
Delphi-Quellcode:
Function ReadEE : FT_Result;
var ManufacturerBuf : string[8]; ManufacturerIDBuf : string[16]; DescriptionBuf : string[32]; SerialNumberBuf : String[16]; begin ManufacturerBuf := ftData.Manufacturer; ManufacturerIDBuf := ftData.ManufacturerID; DescriptionBuf := ftData.Description; SerialNumberBuf := ftData.SerialNumber; Result := FT_EE_Read(Multi_Handle,@FtData); if Result <> FT_OK then FT_Error_Report('FT_EE_Read',Result); end; Das blöde ist, dass die Beispiele in C-Sprache sind und ich nicht weiss ob ich sie richtig übertragen habe... Code zum Programmieren
Code:
Code zum Lesen
FT_PROGRAM_DATA (EEPROM Programming Interface)
typedef struct ft_program_data { WORD VendorId; // 0x0403 WORD ProductId; // 0x6001 char *Manufacturer; // "FTDI" char *ManufacturerId; // "FT" char *Description; // "USB HS Serial Converter" char *SerialNumber; // "FT000001" if fixed, or NULL WORD MaxPower; // 0 < MaxPower <= 500 WORD PnP; // 0 = disabled, 1 = enabled WORD SelfPowered; // 0 = bus powered, 1 = self powered WORD RemoteWakeup; // 0 = not capable, 1 = capable bool Rev4; // true if Rev4 chip, false otherwise bool IsoIn; // true if in endpoint is isochronous bool IsoOut; // true if out endpoint is isochronous bool PullDownEnable; // true if pull down enabled bool SerNumEnable; // true if serial number to be used bool USBVersionEnable; // true if chip uses USBVersion WORD USBVersion; // BCD (0x0200 => USB2) } FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;
Code:
FT_PROGRAM_DATA ftData;char ManufacturerBuf[32];
char ManufacturerIdBuf[16]; char DescriptionBuf[64]; char SerialNumberBuf[16]; ftData.Manufacturer = ManufacturerBuf; ftData.ManufacturerId = ManufacturerIdBuf; ftData.Description = DescriptionBuf; ftData.SerialNumber = SerialNumberBuf; ftStatus = FT_EE_Read(ftHandle,&ftData); if (ftStatus == FT_OK) { // FT_EE_Read OK, data is available in ftData } else { // FT_EE_Read FAILED! } vielleicht bin ich hier auch total falsch... Aber bin trotzdem dankbar für jede Hilfe PEACE STW |
Re: Auslesen/Programmieren
Hi STW,
ich hab zwar keine Ahnung von FT232BM ?? Aufgefallen ist mir aber, daß die Deklarationen nicht ganz korrekt sind.
Delphi-Quellcode:
Vielleicht geht's so :?:
Function ReadEE : FT_Result;
var ManufacturerBuf : string[32]; ManufacturerIDBuf : string[16]; DescriptionBuf : string[64]; SerialNumberBuf : String[16]; myftData : ftData; begin ManufacturerBuf := myftData.Manufacturer; ManufacturerIDBuf := myftData.ManufacturerID; DescriptionBuf := myftData.Description; SerialNumberBuf := myftData.SerialNumber; Result := FT_EE_Read(Multi_Handle,@myFtData); if Result <> FT_OK then FT_Error_Report('FT_EE_Read',Result); end; |
Re: Auslesen/Programmieren
hy s14
hmmm...
Delphi-Quellcode:
die länge der Strings bestimme ich ja selbst...
ManufacturerBuf : string[32];
ManufacturerIDBuf : string[16]; DescriptionBuf : string[64]; SerialNumberBuf : String[16]; daher sollte es eigentlich unwichtig sein wie lang sie sind
Delphi-Quellcode:
das klappt gar nicht...
myftData : ftData;
Das ist ja das selbe wie ich habe, nur dass es nicht mehr ftData sonder myFtData heisst... PEACE STW |
Re: Auslesen/Programmieren
Die Stringlängen hab ich nur aus dem C-Source übernommen, es sollten halt so viele Fehlerquellen wie möglich ausgeschaltet werden.
In der Funktion greifst Du direkt auf den Typ zu, deshalb hab ich eine Variable dieses Typs verwendet, damit die Funktion "FT_EE_Read" die Daten in der Variablen ablegen kann. An welcher Stelle tritt eigentlich der Fehler genau auf und wie lautet die Fehlermeldung (GetLastError)? |
Re: Auslesen/Programmieren
naja die Meldung kommt:
Project EXProgrammer.exe raised exception class EAccessViolation with message 'Access violation at address 00402C43 in Module 'EXProgrammer.EXE'. Read of Address 00000000'. Process stopped. Use Step or Run to continue. und zwar nach der Zeile:
Delphi-Quellcode:
ManufacturerBuf := ftData.Manufacturer;
|
Re: Auslesen/Programmieren
Das sagt eindeutig aus, das der Variablen ftdata kein Speicher zugewiesen ist.
Es wird versucht etwas auszulesen was nicht da ist :-( Deshalb muss eben der Record ftData erst als Variable deklariert, dann mit Inhalt gefüllt werden. Woher kommen die Daten in der Funktion "ReadEE"?? |
Re: Auslesen/Programmieren
Die Werte von FtData sind in einem EEPROM gespeichert
Also wenn ich das Prog öffne, das EEPROM mit dem ftData programmiere und dann versuche auszulesen klappt es! Dann bekomme ich die 4 strings. Aber wenn ich das Prog öffne und dann gleich auslesen möchte kommt eben dieser Error... :wall: Die Daten müssen aber doch immer noch im EEPROM gespeichert sein... |
Re: Auslesen/Programmieren
Naja soweit kommst Du ja gar nicht.
Ich stochere hier ziemlich im Trüben :roll: Aber, was ist damit:
Delphi-Quellcode:
Function ReadEE : FT_Result;
var ManufacturerBuf : string[32]; ManufacturerIDBuf : string[16]; DescriptionBuf : string[64]; SerialNumberBuf : String[16]; myftData : ftData; begin Result := FT_EE_Read(Multi_Handle,@myFtData); if Result = FT_OK then begin ManufacturerBuf := myftData.Manufacturer; ManufacturerIDBuf := myftData.ManufacturerID; DescriptionBuf := myftData.Description; SerialNumberBuf := myftData.SerialNumber; // -- enthalten die Variablen jetzt die Werte?? end else FT_Error_Report('FT_EE_Read',Result); end; |
Re: Auslesen/Programmieren
Manche Dinge lasssen mir keine Ruhe :drunken:
Wir sind von unterschiedlichen Deklarationen ausgegangen:
Delphi-Quellcode:
und dann in einer Methode folgendes:
type
PFT_PROGRAM_DATA = ^FT_PROGRAM_DATA; FT_PROGRAM_DATA = packed record //(EEPROM Programming Interface) VendorID : word; ProductID : word; Manufacturer : PChar; ManufacturerID : PChar; Description : PChar; SerialNumber : PChar; MaxPower : word; PnP : Word; SelfPowered : Word; RemoteWakeup : Word; Rev4 : boolean; IsoIn : boolean; IsoOut : boolean; PullDownEnable : boolean; SerNumEnable : boolean; USBVersionEnable : boolean; USBVersion : Word; end;
Delphi-Quellcode:
Wie gesagt, ich kann es nicht testen. Sieht aber nicht schlecht aus :)
var
ftHandle : FT_HANDLE; ftData : FT_PROGRAM_DATA; ftstatus : FT_STATUS; begin ftStatus = FT_Open(0, @ftHandle); if ftStatus = FT_OK then begin ftstatus := FT_EE_Read(ftHandle, @ftData); if ftstatus FT_OK then begin // FT_EE_Read OK, data is available in ftData // in ftData müssten nun alle Daten enthalten sein !! end else FT_Error_Report('FT_EE_Read', ftstatus); end; Gruß aus dem verschneiten München |
Re: Auslesen/Programmieren
hmmm...
dass ganze ist wahrscheinlich ein bisschen verwirrend :? hab nun mal alles reingepackt was hierfür notwendig ist...
Delphi-Quellcode:
type
TFtData = Record VendorID : word; ProductID : word; Manufacturer : PChar; ManufacturerID : PChar; Description : PChar; SerialNumber : PChar; MaxPower : word; PnP : Word; SelfPowered : Word; RemoteWakeup : Word; Rev4 : boolean; IsoIn : boolean; IsoOut : boolean; PullDownEnable : boolean; SerNumEnable : boolean; USBVersionEnable : boolean; USBVersion : Word; end; var ftData : TFtData; implementation function FT_EE_Program(fthandle: DWord; FT_Data: Pointer) : FT_Result; stdcall ; External FT_DLL_Name name 'FT_EE_Program'; function FT_EE_Read(fthandle: DWord; FT_Data: Pointer) : FT_Result; stdcall ; External FT_DLL_Name name 'FT_EE_Read'; Function ReadEE : FT_Result; var ManufacturerBuf : string[32]; ManufacturerIDBuf : string[16]; DescriptionBuf : string[64]; SerialNumberBuf : string[16]; begin ManufacturerBuf := ftData.Manufacturer; ManufacturerIDBuf := ftData.ManufacturerID; DescriptionBuf := ftData.Description; SerialNumberBuf := ftData.SerialNumber; Result := FT_EE_Read(Multi_Handle,@FtData); if Result <> FT_OK then FT_Error_Report('FT_EE_Read',Result); end; Function ProgramEE : FT_Result; begin Result := FT_EE_Program(Multi_Handle,@FtData); if Result <> FT_OK then FT_Error_Report('FT_EE_Program',Result); end; die Functionen ReadEE und ProgramEE werden durch ButtonClicks aufgerufen... das komische ist, wenn ich
Delphi-Quellcode:
vollkommen weglasse, stürzt das Prog nicht mehr ab.
ManufacturerBuf := ftData.Manufacturer;
ManufacturerIDBuf := ftData.ManufacturerID; DescriptionBuf := ftData.Description; SerialNumberBuf := ftData.SerialNumber; Die anderen Werte werden alle angezeigt! ( Also boolean, word -werte vom record) ... |
Re: Auslesen/Programmieren
Also enhält ftData nun die gewünschten Werte?
Wo ist dann das Problem?? :-)) |
Re: Auslesen/Programmieren
ja ftData enthält die werte...
aber nur dann, wenn ich das Porg öffne und das EEPROM programmiere und dann die Daten auslesen... wenn ich das Prog öffne und dann gleich auslesen will, stürzt es immer noch ab... ausser eben ich habe
Delphi-Quellcode:
nicht drin
ManufacturerBuf := ftData.Manufacturer;
ManufacturerIDBuf := ftData.ManufacturerID; DescriptionBuf := ftData.Description; SerialNumberBuf := ftData.SerialNumber; oder ich habe bei
Delphi-Quellcode:
die stringlänge nicht definiert... :gruebel:
ManufacturerBuf : string;
ManufacturerIDBuf : string; DescriptionBuf : string; SerialNumberBuf : string; dann aber zeigt es mir die Werte von
Delphi-Quellcode:
nicht an, sonder nur die ftData-Werte, die Boolean oder Word sind!
ftData.Manufacturer, ftData.ManufacturerID, ftData.Description, ftData.SerialNumber
die PChar-Werte zeigt es dann nicht an! Der Sinn der ganze Sache wäre, dass man div. Devices anschliessen kann und dann alle Daten wie Serienummer, Beschreibung, usw. auslesen kann. :| |
Re: Auslesen/Programmieren
Die Stringlänge spielt ja auch keine Rolle, da in ftData sowieso nur Zeiger auf NULL-Terminierte Zeichenketten sind.
Ich hab im Web folgende Doku gefunden: ![]() Die Funktion zum lesen der Daten hab ich mal nach Delphi übersetzt, vielleicht hilft's ja weiter. Das Hinweisfenster ist natürlich nur ein Test und sollte eigentlich etwas anzeigen. Ich vermute Du hast die Funktion FT_Open noch nicht aufgerufen wenn das Prog startet!?
Delphi-Quellcode:
var
ftHandle : FT_HANDLE; ftData : FT_PROGRAM_DATA; ftstatus : FT_STATUS; begin ftStatus = FT_Open(0, @ftHandle); if ftStatus = FT_OK then begin ftstatus := FT_EE_Read(ftHandle, @ftData); if ftstatus FT_OK then begin // FT_EE_Read OK, data is available in ftData // in ftData müssten nun alle Daten enthalten sein !! showmessage(ftData.Manufacturer); end else FT_Error_Report('FT_EE_Read', ftstatus); end; end; |
Re: Auslesen/Programmieren
ja die Doku hab ich auch...
aber beim Hinweisfenster zeigt es mir nichts an ausser eben ich programmiere es zuerst... aber das ist ja schon bekannt... ist den das hier nicht mehr nötig?
Delphi-Quellcode:
es ist doch seltsam, dass die boolean und word werte ohne probleme ausgelsen werden können, bei den PChar aber solche probleme auftreten... :?:
ManufacturerBuf := ftData.Manufacturer;
ManufacturerIDBuf := ftData.ManufacturerID; DescriptionBuf := ftData.Description; SerialNumberBuf := ftData.SerialNumber; langsam ist es zum :kotz: Danke dir mal jedenfalls für die ganzen Tips bis jetzt! :thuimb: hoffe wir finden dass noch raus... PEACE STW |
Re: Auslesen/Programmieren
Die sind so eigentlich nicht nötig.
Stimmen die anderen Werte wirklich oder sind es Zufallswerte? Wird die Proc von mir korrekt durchlaufen, FT_OK , FT_EE_Read, gültiges Handle.. ..also bis zum Fenster? Was erscheint wenn Du einen Breakpoint in die Zeile von "Showmessage()" reinsetzt und mit dem Mauszeiger auf ftData gehst? Es müsste eigentlich der gesammte Inhalt als Hinweisfenster angezeigt werden. Nur nicht aufgeben :-) |
Re: Auslesen/Programmieren
Also wenn ich das Prog öffne und das mache, zeigt es mir im Debug Inspector alle Werte von ftData...
ausser die PChar Werte ... :? Bei denen steht nil... wenn ich zuerst programmiere und dann auslese sind alle Werte vorhanden... jap, deine proc stimmt... |
Re: Auslesen/Programmieren
Also einen hab ich noch:-)
Delphi-Quellcode:
Ich vermute mal das es auch am zuweisen des Speichers liegen kann?!
var
ftHandle : FT_HANDLE; ftData : PFT_PROGRAM_DATA; ftstatus : FT_STATUS; begin ftStatus = FT_Open(0, @ftHandle); if ftStatus = FT_OK then begin GetMem(ftData, SizeOf(FT_PROGRAM_DATA)); ftstatus := FT_EE_Read(ftHandle, ftData); if ftstatus FT_OK then begin // FT_EE_Read OK, data is available in ftData // in ftData müssten nun alle Daten enthalten sein !! end else FT_Error_Report('FT_EE_Read', ftstatus); FreeMem(ftData); end; end; |
Re: Auslesen/Programmieren
Guck nochmal bei dem C-Code, da sind die vier Zeilen anders herum:
Delphi-Quellcode:
Function ReadEE : FT_Result;
var ManufacturerBuf : string[32]; ManufacturerIDBuf : string[16]; DescriptionBuf : string[64]; SerialNumberBuf : string[16]; begin ftData.Manufacturer := @ManufacturerBuf[1]; // Die ftData.ManufacturerID := @ManufacturerIDBuf[1]; // vier ftData.Description := @DescriptionBuf[1]; // meine ftData.SerialNumber := @SerialNumberBuf[1]; // ich Result := FT_EE_Read(Multi_Handle,@FtData); if Result <> FT_OK then FT_Error_Report('FT_EE_Read',Result); end; |
Re: Auslesen/Programmieren
Falls die Strukturen aus C/C++ stammen so hast du die Strings falsch transliert.
Statt
Delphi-Quellcode:
mußtype XYZ = record XYZ: String[48]; end;
Delphi-Quellcode:
werden.
type
XYZ = record XYZ: array[0..48 -1] of Char; end; Gruß Hagen |
Re: Auslesen/Programmieren
Morgen allerseits...
@s14 Das getMem funktioniert nicht so... es kommt die Meldung incompatible Types in der DelphiHelp steht da, dass es einen Pointer und Integer sein muss... FT_PROGRAM_DATA ist ja aber ein record... @scp ich glaube in C und Delphi ist das doch eben gerade seitenverkehrt... oder irre ich mich da? @negaH ich habe für die strings auch PChar genommen also:
Delphi-Quellcode:
und wenn ichs so mache wie dein Vorschlag (also Arrays), kann ich beim EEPROM programmieren die Daten nicht mehr ins ftData einschreiben, da ich sie von Edits herauslese
type
XYZ = record XZW: PChar; end; also:
Delphi-Quellcode:
hmmmm.... :gruebel:
ftData.Manufacturer := PChar(Manufacturer.Text);
PEACE STW |
Re: Auslesen/Programmieren
StrCopy()
|
Re: Auslesen/Programmieren
vielleicht liegt's an inkompatiblität von string und pchar ???
|
Re: Auslesen/Programmieren
Kann es sein, dass das record die PChar irgendwo hinschreibt und dann beim auslesen nicht weiss wo herholen?!
Wenn ja, was kann man degegen unternehmen? PEACE STW |
Re: Auslesen/Programmieren
Zitat:
Ich würde in dem Fall dann auch Char-Arrays nehmen, die kannst du dann z.B. mit
Delphi-Quellcode:
verändern.
StrPCopy(ftData.Manufacturer, Manufacturer.Text);
|
Re: Auslesen/Programmieren
Hallo
Brauch nochmals ein bisschen Hilfe... nochmals ein bisschen code Hab es nun mit Arrays gemacht:
Delphi-Quellcode:
Hier ist, wie ich die ftData einlese:
type
PFT_PROGRAM_DATA = ^FT_PROGRAM_DATA; FT_PROGRAM_DATA = packed record //(EEPROM Programming Interface) VendorID : word; ProductID : word; Manufacturer : Array [0..12] of Char; // PChar; ManufacturerID : Array [0..8] of Char; // PChar; Description : Array [0..24] of Char; // PChar; SerialNumber : Array [0..12] of Char; // PChar; MaxPower : word; PnP : Word; SelfPowered : Word; RemoteWakeup : Word; Rev4 : boolean; IsoIn : boolean; IsoOut : boolean; PullDownEnable : boolean; SerNumEnable : boolean; USBVersionEnable : boolean; USBVersion : Word; end; var ftData : FT_PROGRAM_DATA; implementation function FT_EE_Program(fthandle: DWord; PFT_PROGRAM_DATA: Pointer) : FT_Result; stdcall ; External FT_DLL_Name name 'FT_EE_Program'; function FT_EE_Read(fthandle: DWord; PFT_PROGRAM_DATA: Pointer) : FT_Result; stdcall ; External FT_DLL_Name name 'FT_EE_Read'; Function ProgramEE : FT_Result; begin Result := FT_EE_Program(Multi_Handle,@FTData); if Result <> FT_OK then FT_Error_Report('FT_EE_Program',Result); end; Function ReadEE : FT_Result; begin Result := FT_EE_Read(Multi_Handle,@FTData); if Result <> FT_OK then FT_Error_Report('FT_EE_Read',Result); end;
Delphi-Quellcode:
Jedoch stürzt das Prog bei dieser Zeile immer ab!
procedure TForm1.ProgramButClick(Sender: TObject);
begin DeviceIndex := 0; GetFTDeviceCount; if NumDevs > 0 then repeat case DeviceIndex of 0: DevNumber := SR1.Text; 1: DevNumber := SR2.Text; end; FT_OpenEx(DevNumber,FT_OPEN_BY_SERIAL_NUMBER,@Multi_Handle); FtData.VendorID := StrToInt('$'+VendorID.Text); ftData.ProductID := StrToInt('$'+ProductID.Text); StrNew(StrPCopy(ftData.Manufacturer, (Manufacturer.Text))); StrNew(StrPCopy(ftData.ManufacturerID, (ManufacturerID.Text))); StrNew(StrPCopy(ftData.Description, (Description.Text))); StrNew(StrPCopy(ftData.SerialNumber, ((SerialNumber.Text + IntToStr(DeviceIndex))))); ftData.MaxPower := strtoint(MaxPower.Text); ftData.PnP := StrToInt(PnP.Items[PnP.ItemIndex]); ftData.SelfPowered := StrToInt(SelfPowered.Items[SelfPowered.ItemIndex]); ftData.RemoteWakeup := StrToInt(RemoteWakeup.Items[RemoteWakeup.ItemIndex]); ftData.Rev4 := False; ftData.IsoIn := False; ftData.IsoOut := False; ftData.PullDownEnable := False; ftData.SerNumEnable := True; ftData.USBVersionEnable := True; if USBVersion.Text = 'USB 2.0' then ftData.USBVersion := $0200 else ftData.USBVersion := $0110; ProgramEE; Close_USB_Device; inc(DeviceIndex); dec(NumDevs); until NumDevs = 0; SerialNumber.Text := SerialNumberEdit.Text; end;
Delphi-Quellcode:
und der EAccesViolation-Error erscheint...
function FT_EE_Program(fthandle: DWord; PFT_PROGRAM_DATA: Pointer) : FT_Result; stdcall ; External FT_DLL_Name name 'FT_EE_Program';
Hat vielleicht noch jemand eine Idee? PEACE STW |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz