www.mikrocontroller.net

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


Autor: Andreas Holzheimer (andreasholzheimer)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste mal Deinen Quelltext und nicht nur ein Schnipselchen.

Autor: Andreas Holzheimer (andreasholzheimer)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Holzheimer (andreasholzheimer)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas Holzheimer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas Holzheimer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.