www.mikrocontroller.net

Forum: Compiler & IDEs FTDI D2XX ab und zu Fehler


Autor: kaplan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich benutze den FT232R. Baudrate ist auf 1Mbit passend zu 16MHZ 
Mikrocontrollertakt gewählt.

Die Übertragung ist super. Allerdings triit ab und zu ein Fehler auf, 
und dann gewaltig. Etwa 1 Sekunde Problemlose Übertragung, dann für 0.25 
Sekunden nur Fehler.
Das wiederholt sich zyklisch.

Ich hab keine Ahnung wo das problem her kommen könnte.
Es geschieht auch mit langsameren Baudraten!!!!

Ich dachte schon an einen Bufferoverflow oder so...
kann das sein?

ich benutye den Befehl:
FT_GetStatus ( FT_HANDLE ftHandle, LPDWORD lpdwAmountInRxQueue, LPDWORD 
lpdwAmountInTxQueue, LPDWORD lpdwEventStatus )
Für lpdwAmountInRxQueue == 1 gebe ich das Byte zurück. D.h. es dürfte 
kein Overflow kommen, da ich sofort nach dem Empfang eines Bytes es 
verarbeite.

aber woher kann sonst der zyklische fehler kommen???

der Mikrocontroller sendet zyklisch Daten aber nur kleine pakete. ich 
empfang die pakete einige male erfolgreich nacheinander.

hier noch meine methode zum empfangen:
int FTDI_COMM::receive(unsigned char* message, FT_STATUS &ftStatus, FT_HANDLE &ftHandle1, bool debuginfo){    
    // receive a message
    DWORD RxBytes;
    DWORD RxBytes_man =1;
    DWORD TxBytes;
    DWORD EventDWord;
    DWORD BytesReceived;
    unsigned char RxBuffer[1];    
    unsigned char var = 0;

    ftStatus = FT_GetStatus(ftHandle1,&RxBytes,&TxBytes,&EventDWord);
    if ( ftStatus != FT_OK ) {
      cout<<"Could not get status!";
      return -1;
    }  

    if (RxBytes = 1) {
      ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
      if (ftStatus == FT_OK) {        

        *message = 0x00;
        *message = RxBuffer[0];
        var= *message;

        if (debuginfo == 1){
          printf("Message from ftdi: %d  bytes: %d\n",var,BytesReceived);
        }        
      
      }
      else {
        // FT_Read Failed
        cout<<"Read Buffer Failed!";
        return -1;
      }
    }

    else return -1;

    return 1;
}


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du die RTS, CTS Leitungen am Mikrocontroller angeschlossen? Glaube 
ich zwar nicht dran, aber wer weiß?

Autor: kaplan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTS und CTS sind nicht angeschlossen.
Nur RXD und TXD.

Mittlerweile habe ich noch herausgefunden dass bis zu einer Baudrate von 
312500 alles ok ist. Erst bei höheren Baudraten gibt es probleme (z.b. 
bei 500000). Diese sollte aber 0% Fehler bei 20MHz Systemtakt haben 
(ATMega644).

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie ist die Empfangsroutine etwas merkwürdig, da der FTDI die 
Daten nur zum PC "sendet", wenn: entweder der interne Puffer voll ist, 
sich die Statussignale (CTS, DSR,...) geändert haben, Eventzeichen 
erkannt wurden oder der interne Timer abgelaufen ist.
D.h. das im Normalfall eher selten nur genau ein einzelnes Byte ankommt.
Ausser der AVR wartet entweder lang genug zwischen zwei Bytes oder die 
Statusleitungen werden geändert.
Also statt dem sowieso falschen if (RxBytes = 1) { } (= statt ==)
sollte dort if (RxBytes > 0) stehen.

Zweites Problem: Wie oft kommt das PC-Programm in FTDI_COMM::receive?
Wird hier gepollt oder mit Events gearbeitet (eigener Thread mit 
FT_SetEventNotification / WaitForSingleObject)?

http://www.ftdichip.com/Documents/AppNotes/AN232B-...

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arc Net wrote:

> Also statt dem sowieso falschen if (RxBytes = 1) { } (= statt ==)
> sollte dort if (RxBytes > 0) stehen.

oh man das hab ich vollkommen übersehen. seit ich das geändert habe 
bekomme ich aber noch mehr Übertragungsfehler... hmpf

ich hab mal ein neuen Beitrag aufgemacht, hier passt das nicht mehr 
rein.

Beitrag "FTDI Konfiguration"

> Zweites Problem: Wie oft kommt das PC-Programm in FTDI_COMM::receive?
> Wird hier gepollt oder mit Events gearbeitet (eigener Thread mit
> FT_SetEventNotification / WaitForSingleObject)?

Ich benutze Glut. Dort kann man eine Loop Funktion angeben. In der Loop 
funktion wird per FTDI Daten empfangen...
auf der seite nennen sie das "Callback driven event processing"

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.