Forum: PC-Programmierung VBA, Win7, FT232BM Baustein, 16 Bytes auslesen, Buffer ist aber leer


von Andreas H. (andreasholzheimer)


Lesenswert?

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.

: Verschoben durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Poste mal Deinen Quelltext und nicht nur ein Schnipselchen.

von Andreas H. (andreasholzheimer)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Andreas H. (andreasholzheimer)


Lesenswert?

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?

von Andreas Holzheimer (Gast)


Lesenswert?

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?

von Andreas Holzheimer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.