Forum: Mikrocontroller und Digitale Elektronik FT4232 zu langsam


von Sabine M. (zizo)


Lesenswert?

Hi,
ich habe ein FT232R mit ein PIC16F630 angeschlossen.Ich habe die UART 
RXD und TXD für die Daten-kommunikation verwendet. Um den FT232 zu 
steuren habe ich ein Programm in VisualBasic 2008 geschrieben. Es wir 
ein Byte von FTDI zu PIC gesendet dann wird ein Byte von der PIC zu FTDI 
gesendet. Mit 19200 Baudrate habe ich  2000 Byte/s erreicht. Dann habe 
ich mir den FT4232 besorgt. Ich habe den gleichen Programm mit FT4232H 
verwendet. Das Problem ich kriege nur 60 Byte/s. Wenn ich die Daten vom 
FT4232 nur sende, erreiche ich ein Byte pro 100 us. Wenn ich sende und 
Empfange(von FTDI lese) dann habe ich nur 60 Byte /s.

Warum die Datenübertragung mit FT4232H zu langsam ist ?

S.
Danke

von Falk B. (falk)


Lesenswert?

@Sabine Mühller (zizo)

>Warum die Datenübertragung mit FT4232H zu langsam ist ?

Liegt möglicherweise an vergurkten FIFO-Einstelungen im FT4232 oder 
Problemen in deinem Visual Basic Programm. Der IC kann locker 115k2 ohne 
Pause, eher mehr.

MFg
Falk

von Ralf (Gast)


Lesenswert?

Du musst beachten, dass USB ein Paket-orientiertes Protokoll hat. Das 
heisst, wenn du viele Bytes auf einmal anstatt nur einzelne Bytes 
raushaust, bekommst du Speed.

Ralf

von Sabine M. (zizo)


Lesenswert?

Hi,
also es liegt nicht am Visual Basic Programm, weil mit den anderen IC 
FT232 war schon schnell.
--Liegt möglicherweise an vergurkten FIFO-Einstelungen
kannst du mir mehr erklären,
mein Code

Initialisierung:



        '''''''''''''''Port A


        FT_Status = FT_OpenByIndex(0, FT_Handle0)
        If FT_Status <> FT_OK Then
            ListBox1.Items.Add("PORTA Öffnet sich nicht")
            Exit Sub
        End If
        ' Display device count on form
        ListBox1.Items.Add("PORTA Öffnet sich ")



        ' Purge buffers
        FT_Status = FT_Purge(FT_Handle0, FT_PURGE_RX Or FT_PURGE_TX)
        If FT_Status <> FT_OK Then
            ListBox1.Items.Add("Purge Failed")
            Exit Sub
        End If


        ' Set Baud Rate
        FT_Status = FT_SetBaudRate(FT_Handle0, 923076)
        If FT_Status <> FT_OK Then
            ListBox1.Items.Add("Baudrate Failed")
            Exit Sub
        End If

        ' Set Timeout
        FT_Status = FT_SetTimeouts(FT_Handle0, 5000, 0)
        If FT_Status <> FT_OK Then
            ListBox1.Items.Add("Timeout Failed")
            Exit Sub
            ''
        End If

        ' Set parameters
        FT_Status = FT_SetDataCharacteristics(FT_Handle0, 
FT_DATA_BITS_8, FT_STOP_BITS_2, FT_PARITY_NONE)
        If FT_Status <> FT_OK Then
            ListBox1.Items.Add("SetDataCharacteristics Failed")
            Exit Sub
        End If


        ' Set Flow Control
        FT_Status = FT_SetFlowControl(FT_Handle0, FT_FLOW_NONE, 0, 0)
        If FT_Status <> FT_OK Then
            ListBox1.Items.Add("SetFlowControl Failed")
            Exit Sub
        End If



Lesen+Schreiben:



Do While x < 10000
            x = x + 1
            i = 0
            senddaten = 1
            ''If senddaten = 256 Then
            ''senddaten = 0
            ''End If

            strwritebuffer = Chr(senddaten)
            ''TextBox4.Text = Asc(strwritebuffer)


            BytesWritten = 0
            ' Write string data to device
            FT_Status = FT_Write_String(FT_Handle0, strwritebuffer, 1, 
BytesWritten)
            If FT_Status <> FT_OK Then
                Exit Sub
            End If


Wartenaufmehr:


            'Get auf number of Byte waiting to be read
            FT_Status = FT_GetQueueStatus(FT_Handle0, FT_RxQ_Bytes)
            If FT_Status <> FT_OK Then
                Exit Sub
            End If
            i = i + 1
            If i > 2000 Then
                Exit Sub
            End If

            If FT_RxQ_Bytes < 1 Then GoTo Wartenaufmehr

            BytesRead = 0
            TempStringData = " "
            Do
                FT_Status = FT_Read_String(FT_Handle0, TempStringData, 
FT_RxQ_Bytes, BytesRead)
                If FT_Status <> FT_OK Then
                    Exit Sub
                Else
                    Impuls = Impuls + 1
                    If Impuls = 2000000000 Then
                        Impuls = 0
                    End If
                    count1 = Impuls
                End If
                ' Display string on form

                TextBox5.Text = Asc(TempStringData)
loop

von Sabine M. (zizo)


Lesenswert?

Ich verwende die FT4232H mini Module,
hat jemand Erfahrung damit?

von Sabine Mühller (Gast)


Lesenswert?

Kan mir bitte jemand helfen? ich finde den Fehler nicht.

S.

von Falk B. (falk)


Lesenswert?

Nimm das Konfigprogramm für den FTDI, das heisst Mprog. Schau dir die 
Einstellungen für den funktionierenden FT232 sowie den langsamen FT4323 
an, dort sollten Unschiede zu sehen sein. Schau auch in der 
Systemsteuerung im Gerätemanager nach den Einstellungen für die beiden 
virtellen COM-Ports nach. Da sollte man was finden.

MfG
Falk

von Sabine M. (zizo)


Lesenswert?

danke ich habe jetzt die zwei ICs mit FT_Prog ausgelesen, ich habe kein 
Unterschied festgestellt, das gleich auch im Geräte Maneger , ide zwei 
Einstellungen sind gleich!

von Sabine M. (zizo)


Lesenswert?

ich habe USB-Kabel ausgetaucht, es hat nix gebracht.
hat jemand eine Idee?
hat es diese Module schon bei jemanden funktioniert?

von Ralf (Gast)


Lesenswert?

Ich habe doch oben geschrieben, was du tun musst. Dein Programm schreibt 
soweit ich sehen kann ein einziges Byte in den Buffer und ruft danach 
sofort die Senderoutine des FTDI-Chips auf. Das IST LANGSAM, weil du 
damit höchstens 1 Byte abschickst und bis der USB-Bus das nächste Mal 
den FTDI-Chip zum Senden auffordert mindestens 1ms vergeht.
Mache einen Buffer von 256 Bytes, befülle ihn mit den Werten von 0-255 
und schicke diesen Buffer an den FTDI-Chip und messe die Geschwindigkeit 
der Übertragung.

Ralf

von Sabine M. (zizo)


Lesenswert?

Danke Ralf,
es klappt , wenn ich mehr als ein Wert zu schieken, gut , von den 
Baudrate 100 Wert zu schreiben und dann lesen ist schon mal gut . ich 
habe noch ein Problem , ich lese immer den anfangswert. Ich finde den 
Fehler nicht

S.



 i = 0
        BytesWritten = 0


        Do
            sumx = 2 + xtx
            senddaten = sumx  '' senddaten hoch zählen

            If sumx = 50 Then
                xtx = 0
            End If

            strwritebuffer = Chr(senddaten)




            ' Write string data to device
            FT_Status = FT_Write_String(FT_Handle0, strwritebuffer, 100, 
BytesWritten)
            If FT_Status <> FT_OK Then
                Exit Sub
            End If

        Loop Until (BytesWritten = 100)
        ListBox1.Items.Add("500 ok")
Wartenaufmehr:


        'Get auf number of Byte waiting to be read
        FT_Status = FT_GetQueueStatus(FT_Handle0, FT_RxQ_Bytes)
        If FT_Status <> FT_OK Then
            Exit Sub
        End If
        i = i + 1
        If i > 2000000 Then
            Exit Sub
        End If

        If FT_RxQ_Bytes < 100 Then GoTo Wartenaufmehr

        BytesRead = 0
        TempStringData = " "
        Do
            BytesRead = 0
            FT_Status = FT_Read_String(FT_Handle0, TempStringData, 
FT_RxQ_Bytes, BytesRead)
            If FT_Status <> FT_OK Then
                Exit Sub

            End If
            ' Display string on form

            TextBox5.Text = Asc(TempStringData)
            ListBox1.Items.Add(Asc(TempStringData))

        Loop Until (FT_RxQ_Bytes = BytesRead)
        If FT_RxQ_Bytes = BytesRead Then
            ListBox1.Items.Add("lesen ok")
        End If

von Sabine M. (zizo)


Lesenswert?

Fehler gefunden
sumx = 2 +sumx


Danke
S.

von Ralf (Gast)


Lesenswert?

> ich habe noch ein Problem , ich lese immer den anfangswert.
Ehrlich gesagt kann ich dir da nicht helfen, weil dein Code völlig 
unverständlich ist und er hat nicht mal Kommentare, aus denen man 
schließen kann, was du auf welche Weise lösen möchtest.

Versuch doch bitte, den Code mit Kommentaren auszustatten, damit wir 
hier nachvollziehen können, was du vorhast, und was du tatsächlich 
machst. Wenn du Probleme mit der deutschen Sprache hast, schreib die 
Kommentare in Englisch, wenn du das besser kannst. Die Hauptsache ist, 
wir verstehen erstmal was da abläuft, aber ohne kommentierten Code kann 
ich jedenfalls nur raten und ich möchte mich eigentlich nicht durch 
unkommentierten Code durchlesen.

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.