Hallo,
habe ein USB Gerät mit og. Chip.
Im Terminalprogramm sehe ich wie die Daten vom Gerät über FTDI gemeldet
werden. Habe einen Rechner mit Win7und programmiere in einer Datenbank
unter Access 2003 die Kommunikation mit dem Gerät.
Die Einbindung der DLL etc. hat geklappt. Kann das Gerät ansteuern.
Der READ funktioniert nur halb:
ftstatus = FT_Read(lngHandle, FT_rxbuffer, RxBytes,
lngBytesRead)
Beispielsweise habe ich 16 Bytes erwartet. Der read Befehl wird
ausgeführt und in lngBytesRead steht er hat 16 Bytes gelesen.
Aber der FT_rxbuffer bleibt leer. Mit debug funktionen etc. getestet.
Der Buffer ist als string deklariert. BaudRate etc. habe ich x-mal
geprüft.
Könnte es evtl. sein - das ein terminalprogramm die Daten gar nicht
abholt.
Sondern diese durchgereicht bekommt, und dann der Read falsch wäre?
Kann mir jemand helfen? Danke Andi.
Poste mal Deinen Quelltext und nicht nur ein Schnipselchen.
Danke für die Reaktion:
a) die Funktion (von FTDI)
#Public Declare Function FT_Read Lib "FTD2XX.DLL" ( _
ByVal lngHandle As Long, _
ByVal lpszBuffer As String, _
ByVal lngBufferSize As Long, _
ByRef lngBytesReturned As Long) As
Long
b) der Read
Private Sub LESE
Dim FT_rxbuffer As String
Me!Ergebniss = Me!Ergebniss & vbCrLf & vbCrLf & (" -------------
DATENEMPFANGSMODUS -----------------")
inghandle = Me![USB_ANZAHL]
flTimedout = False
flFatalError = False
If FT_GetQueueStatus(lngHandle, RxBytes) <> FT_OK Then '
Anzahl der Bytes in der Warteschlange lesen
MsgBox ("Status war fehlerhaft")
Else
Me!Ergebniss = Me!Ergebniss & vbCrLf & RxBytes & " Bytes in Queue"
End If
WARTEN:
ftstatus = FT_GetStatus(inghandle, FT_RxBytes, FT_TXBYtes,
ingevent_get_stat)
If ftstatus = FT_OK Then
Else
If ftstatus = FT_IO_ERROR Then
MsgBox ("Fehler 10")
End If
End If
I = I + 1
If I > 20000 Then
MsgBox ("Keine Antwort - es wird abgebrochen")
Exit Sub
End If
If FT_RxBytes < 18 Then
GoTo WARTEN
End If
flTimedout = False
flFatalError = False
lngTotalBytesRead = 0
FT_rxbuffer = ""
If FT_RxBytes > 0 Then
Do ' FTDI - Buffer auslesen
lngBytesRead = 0
ftstatus = FT_Read(lngHandle, FT_rxbuffer, RxBytes,
lngBytesRead)
If (ftstatus = FT_OK) Or (ftstatus = FT_IO_ERROR) Then
If lngBytesRead > 0 Then
lngTotalBytesRead = lngTotalBytesRead + lngBytesRead
'Debug.Print "RX1: " & lpszBuffer
Else
flTimedout = True
End If
Else
flFatalError = True
End If
Loop Until (lngTotalBytesRead = RxBytes) Or (flTimedout = True)
Or (flFatalError = True)
If (flTimedout = False) And (flFatalError = False) Then
Me!EINGANG = "RX GES: " & FT_rxbuffer
Debug.Print "RX GES: " & FT_rxbuffer
Me!Ergebniss = Me!Ergebniss & vbCrLf & ("Byte Daten gelesen:
" & lngTotalBytesRead)
Else
MsgBox ("Fehler beim Lesen")
End If
Else
MsgBox ("Keine Daten vorhanden - Bitte prüfen ob Gerätemessung
schon abgeschlossen")
End If
end sub
c) das Ergebniss:
------------- DATENEMPFANGSMODUS -----------------
18 Bytes in Queue
Byte Daten gelesen: 18
aber kein Wert im FT-rxbuffer
Keine ahnung ob es am Code oder was anders liegt.
Andreas Holzheimer schrieb: > #Public Declare Function FT_Read Lib "FTD2XX.DLL" ( _ > ByVal lngHandle As Long, _ > ByVal lpszBuffer As String, _ > ByVal lngBufferSize As Long, _ > ByRef lngBytesReturned As Long) As Bist Du Dir sicher, daß lpszBuffer korrekt deklariert ist? Mach mal aus ByVal ein ByRef.
sicher bin ich mir ganz und gar nicht ...
Aber habe ich gerne mal ausprobiert:
ByRef lpszBuffer As string --> Da stürzte mir gleich das Access ab.
dann mal mit Any probiert:
ByRef lpszBuffer As Any --> Da stürzte mir gleich wieder das Access ab.
Habe das dann nochmals in der Literatur geprüft - war schon so OK.
Public Declare Function FT_Read Lib "FTD2XX.DLL" ( _
ByVal lngHandle As Long, _
ByVal lpszBuffer As String, _
ByVal lngBufferSize As Long, _
ByRef lngBytesReturned As Long) As
Long
Aber irgend sowas wird es wohl sein.
Außerdem - finde ich super - das R.t.F. gleich so schnell reagiert und
Ideen zum Checken gibt.
Hat vielleicht irgendwer schon ein VBA Programm unter WIN7 mit diesem
beihaltigem Baustein und mit einer READ-Anweisung laufen?
Hallo, habe zwischenzeitlich die ganze Sache auf WinXP gespielt und getestet. Der Befehl verhält sich wie bei WIN7: - Bytes werden gelesen, aber im Buffer steht nix drin. Hat jemand sowas im VBA unter winXP schon gemacht?
Hallo, ich glaub es nicht - Problem ist gelöst! Der Trick für alle, die isch auch 36 Stunden am Stück plagen, ist man muss im VBA die String Variable mit Buffer Size verweben. Lösung bei mir war/ist die Nachfolgende Deklaration: ' IO buffer sizes Public Const FT_In_Buffer_Size = 1024 Public FT_rxbuffer As String * FT_In_Buffer_Size Das war auch nirgends so beschrieben. Danke an Rufus und Team - denn ich hatte das Gefühl, ich war nicht allein. Ciao Andi
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.