Forum: PC-Programmierung Aus FT245RL Byte für Byte lesen


von Willi S. (Gast)


Lesenswert?

Hallo,

habe wieder mal eine Frage bzgl. dem Lesen aus einem FT245RL. Ich
benutze hierfür den CDM (Combined Driver Model) mit der FTD2xx DLL. Es
ist wirklich sehr bequem mit Hilfe der zur Verfügung gestellten
Funktionen zu programmieren. Mit dem VCP habe ich es nicht zu 100%
hinbekommen, aber die Geschwindigkeit von ca. 300kByte/sek. wäre ja
ohnehin nicht so berauschend.

Aber nun zum eigentlichen Problem! Im Programmierhandbuch der D2xx.dll
stehen die Methoden in der Sprache C detailiert drin.
Ich programmiere zur Zeit in VB6. Das ist im Grunde kein Problem. Der
Loopback-Test funktioniert 1A und alle anderen Funktionen funktionieren
nach erfolgter Deklaration auch.
Die Funktion "FT_Read" bekommt als Argument den Handler (Nummer, die das
FT245RL genau repräsentiert), ReadBuffer(hier wird der gelesene Inhalt
gebuffert), BytesToRead (gewünschte Anzahl von Bytes, die gelesen werden
sollten) und zum Schluss als Parameter noch BytesRead (tatsächliche
Anzahl von Bytes, die definitiv gelesen worden sind). Wenn alles
geklappt hat und BytesToRead und BytesRead ident sind, wird von der
Funktion 1 bzw. FT_OK zurückgegeben. Das habe ich richtig verstanden.

Das Problem, was ich jetzt habe ist, dass es in VB6 keine Referenzen
gibt (so wie in C). Im Programmierhandbuch wird ein statisches Feld
dieser Read-Methode zurückgegeben, die dann, sofern ich das recht
verstehe, Byte für Byte in dieses Feld abspeichert. Ich kann in VB6 aber
nur eine Variable als Buffer nehmen.
Bei mir beispielsweise ergeben jeweils 4 Bytes eine ganze Zahl. Deshalb
darf ich nur ein Vielfaches von 4 Bytes aus dem FT245RL lesen. Zuerst
kommt das niederwertigste Byte und zum Schluss das höherwertigste Byte.

Wenn ich jetzt zum Beispiel 256 Bytes mit FT_Read lese, werden in der
Buffervariable alle 256 Bytes drin stehen. Jedoch weiß ich nicht, wie
ich die dann zu einzelnen Dezimalzahlen zusammenstoppeln soll. In C wäre
das ja kein Problem, da es dort Referenzen gibt und ich einen Buffer in
Form eines ganzen Feldes übergeben könnte, der mir die einzelnen Bytes
hält - sofern ich das richtig verstanden habe.

Ich hoffe, ich habe mein Problem einigermaßen präzise geschildert und
nicht zu viel unnötige Informationen gepostet. Ich habe nur deswegen so
viel geschrieben, weil ich zeigen wollte, dass ich trotz intensiver
Überlegungen eine kleine Hilfe brauche!

Danke!

lg,
Willi

von Willi S. (Gast)


Lesenswert?

Auszug aus der Doku:

Visual Basic:

Parameter Type Description:

Handle long: A number that uniquely identifies the device
Buffer string: String to hold the data read from the device
BytesToRead long: The number of bytes to read from the device
BytesReturned long: The number of bytes that were read from the device

C:

Parameter Type Description:

Handle pvoid: A pointer to a number that uniquely identifies the device
Buffer lpvoid: A pointer to a char array to hold the data read from the 
device
BytesToRead: dword The number of bytes to read from the device
BytesReturned: lpdword A pointer to a dword that gets the number of 
bytes read
------------------------------------------------------------------------ 
-
Also wird zur Speicherung unter C ein Character-Array genommen und bei 
VB ein einfacher String. Nur, wenn ich jetzt angenommen 128 Bytes lese, 
dann gibt die Funktion so lange nichts zurück, bis alle 128 Bytes 
gelesen wurden. Wenn die 128 Bytes gelesen wurden, dann wird FT_OK 
ausgegeben und der Inhalt wird im Buffer geschrieben. Dieser Buffer ist 
nur eine String-Variable. Ich weiß jetzt leider nicht genau, wie ich da 
byteweise den Inhalt rekonstruieren soll.

lg und Danke!

Willi

von Willi S. (Gast)


Lesenswert?

Habe schon verstanden! Für alle, die noch immer nicht genau wissen, was 
ich eigentlich wollte und später auch vor diesem Problem stehen:
Man muss einen String zerlegen um dann die Daten byteweise zu erhalten.
Es gibt in C keine Strings. Es gibt nur Char-Arrays. In VB gibt es 
Strings. Das ist in etwa äquivaltent.

In VB:

Dim MyString As String * 256

In C:

char my_array [256] //eigentlich 257 Werte intern, da 0 am Schluss

Diese Definitionen haben gleiche Bedeutung.

lg,
Willi

von Ralf (Gast)


Lesenswert?

> char my_array [256] //eigentlich 257 Werte intern, da 0 am Schluss
Sicher, dass da ne Null ist? Soweit ich weiss, wird die Null nur 
eingefügt, wenn du einen Text, eingeschlossen in '"' angibst.

Ralf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.