Forum: Compiler & IDEs FTDI D2XX ab und zu Fehler


von kaplan (Gast)


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:
1
int FTDI_COMM::receive(unsigned char* message, FT_STATUS &ftStatus, FT_HANDLE &ftHandle1, bool debuginfo){    
2
    // receive a message
3
    DWORD RxBytes;
4
    DWORD RxBytes_man =1;
5
    DWORD TxBytes;
6
    DWORD EventDWord;
7
    DWORD BytesReceived;
8
    unsigned char RxBuffer[1];    
9
    unsigned char var = 0;
10
11
    ftStatus = FT_GetStatus(ftHandle1,&RxBytes,&TxBytes,&EventDWord);
12
    if ( ftStatus != FT_OK ) {
13
      cout<<"Could not get status!";
14
      return -1;
15
    }  
16
17
    if (RxBytes = 1) {
18
      ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
19
      if (ftStatus == FT_OK) {        
20
21
        *message = 0x00;
22
        *message = RxBuffer[0];
23
        var= *message;
24
25
        if (debuginfo == 1){
26
          printf("Message from ftdi: %d  bytes: %d\n",var,BytesReceived);
27
        }        
28
      
29
      }
30
      else {
31
        // FT_Read Failed
32
        cout<<"Read Buffer Failed!";
33
        return -1;
34
      }
35
    }
36
37
    else return -1;
38
39
    return 1;
40
}

von Bernd (Gast)


Lesenswert?

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

von kaplan (Gast)


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).

von Arc N. (arc)


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-04_DataLatencyFlow.pdf

von Patrick K. (kaplan)


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"

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.