FTDI D2XX problem

OP #612037
Lesenswert?

Hallo, ich bin fast am verzweifeln.
ich versuche eine kommunikation aufzubauen mit dem ftdi.
mein uC soll Daten zum PC senden. Am Besten sagt der mikrocontroller am 
anfang wieviele Byte, sodass der PC etwas Ahnung hat.

Momentan versuche ich erstmal einzelne Byte zu verschicken.

AVR Code:
1
while (1) {
2
    uart_putc (0xFF); //255
3
    uart_putc (0xEE); //238
4
    uart_putc (0xAB); //171
5
    uart_putc (99); //anzahl pakete
6
    for (i=0;i<99;i++) {
7
      uart_putc(i);  
8
      
9
    }
10
  }

auf PC seite geh ich nach der D2xx programmers guide vor.
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
    
10
    int var_int;
11
    
12

13
    ftStatus = FT_GetStatus(ftHandle1,&RxBytes,&TxBytes,&EventDWord);
14
    if ( ftStatus != FT_OK ) {
15
      cout<<"Could not get status!";
16
      return -1;
17
    }
18
  
19
  
20

21
    if (RxBytes = 1) {
22
      ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
23
      if (ftStatus == FT_OK) {
24
    
25

26
        *message = RxBuffer[0];
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
}


Das Problem ist: wenn ich AVR und PC Seite mit 57600 Baud konfiguriere 
klappt das noch. Der AVR macht keine Delays und Codeoptimierung ist auf 
0.
wenn ich auf 115200 Baud erhoehe dann verlier ich ne Menge pakete.

1
struct ftdi_paket {
2
  unsigned char a;
3
  unsigned char b;
4
  unsigned char c;
5
};
6

7
...
8

9
...
10
int main...
11

12
while (1){
13
    myFTDIobject.receive(&act_char,ftStatus,ftHandle,0);
14
    paket.a = act_char;
15
    paket.c = paket.b;
16
    paket.b = last_char;
17
    
18
/*
19
    printf("ausgelesen 1 : %d ",paket.a);    
20
    printf("  ausgelesen 2 : %d ",paket.b);
21
    printf("  ausgelesen 3 : %d \n",paket.c);
22
    */
23

24
    if ((last_char+1) != act_char) {
25
      printf(" Error: Aktueller Wert: %d  Letzter Wert: %d  OK:%i \n", act_char, last_char, ok);
26
      ok=0;
27
    }
28
    else  {      
29
      ok++;
30
    }
31
    
32
    if ((paket.a == 0xAB) && (paket.b==0xEE)&&(paket.c==0xFF)){
33
        printf (">>>>>>>>>>> HEADER GEFUNDEN!!!!!! <<<<<<<<\n");
34
        ok++;
35
    }
36

37
    last_char= act_char;
38
  }



Hat jemand n Beispiel wie man mit D2XX wirklich schnell daten 
transferieren kann? wenn ich auf 57600 beschraenkt bin, kann ichs grad 
vergessen. und den ftdi hab ich extra wegen der schneller uebertragung 
geholt.

danke fuer die hilfe
Pak
OP #612057
Lesenswert?

hmmm keine ahnung. Ich nutz die UART Library vom Peter Fleury !???!
dort drin setz ich die baudrate auf den gewuenschten wert. ich benutze 
einen externen 16 mhz takt.
aber spaeter wollte ich auf einen Atmega644 mit 20mhz umsteigen.

kannst du etwas code bereitstellen? ich dreh hier noch am rad mit der 
miesen dokumentation
OP #612122
Lesenswert?

Ok die initialisieung war schon recht aehnlich.

ich hatte die Timeouts auf 100,100
Die flow control auf "none"
LATENCYTIMER hab ich auf 50!! ????
FT_SetDataCharacteristics war gleich.
mit 57600 baud ist das ergebnis ok. !!!

wenn ich die baudrate erhoehe (115200), geht wieder mal alles schief.

im moment benutze ich:
1
ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
zum empfangen wobei:
1
DWORD RxBytes_man =1;
2
DWORD BytesReceived;
3
unsigned char RxBuffer[1];

ist das ok? wenn ich die bytes nicht einzeln empfange hatte ich das 
problem dass sich die pakete untereinander verschieben. Beim 
mikrocontroller sende ich z.b. A,B,C die ganze zeit.
empfange dann aber B,C,A. somit konnte ich das nicht mehr zuordnen. also 
bin ich auf einzelne pakete zurueck gegangen.
Gast #612180
Lesenswert?

Äh, mal ne Frage: Wenn du sowieso über den D2XX Treiber gehst, wieso 
willst du dann noch mit den krummen Baudraten rummachen? Also bei meinem 
232RL gehen 500KBit mit 16MHz Takt ohne Probleme. Man könnte auch 1MBit 
oder 250KBit oder 125KBit mit "geraden" Quarzen fahren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren