Probleme mit Synchronisation µC<->PC über USB-Modul



  • hallo
    ich benutze einen atmel µC (atmel) der über ein USB-Modul (DLP-USB245 mit FTDI FT245 chip) mit dem PC verbunden ist. das senden und empfangen von daten (zahlen) funzt in beiden richtungen. (ich verwende c++ builder)

    ich möchte folgende synchronisation mit dem µController, der auf dem USB-Modul hängt, vornehmen:
    µC -> PC "Request"..... PC->µC "Reply" (Request und Reply sind natürlich vordefinierte fixe werte)
    wenn der µC 5mal eine Antwort vom PC bekommt sendet er einmalig noch eine Bestätigung.

    Das Problem: die Fuktion ReadFTDI() liefert mir nichts zurück. wie kann ich aber meine Synchronisation machen. muss ich einen rückgabetyp wählen, wenn ja, welcher?
    mit der folgendne funktion, hätte ich mir die synchronisation überlegt, allerdings ist es dann an obiger frage gescheitert:

    meine funktion zu ReadFTDI() ist void:

    void TFormMain::ReadFTDI (void)
    {
     FT_STATUS ftStatus;
     DWORD EventDWord;
     DWORD RxBytes;
     DWORD TxBytes;
     DWORD BytesReceived;
    
     unsigned char RxBuffer[256];
     int iIndex;
     int iX;
    
     RxBytes=0;
     TxBytes=0;
     BytesReceived=0;
     EventDWord=0;
    
     for(iIndex=0; iIndex<=256; iIndex++)
     {
      RxBuffer[iIndex]=0;
     }
    
     FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
     //FT_SetTimeouts(ftHandle,5000,0);
     if(RxBytes > 0)
     {
      ftStatus = FT_Read(ftHandle,RxBuffer,RxBytes,&BytesReceived);
      if(ftStatus == FT_OK)
      {
       if(BytesReceived == RxBytes)
        {
         for(iX = 0 ; iX < int(BytesReceived) ; iX++)
          {
           Memo->Lines->Add("RxBuffer[iX] = RxBuffer[" + IntToStr(iX) + "]:");
           Memo->Lines->Add(RxBuffer[iX]);
          }
        }
        else
        {
         //no value was written on the bus
        }
      }
      else
      {
       //can not read FTDI chip
      }
     }
    
    bool TFormMain::SyncUSB (void)
    {
     int iReceive;          // erhaltene Zahl von uC
     int iSuccess=0;        // wie oft wurde REQUEST empfangen
     bool bSync;            // ganze Sync OK (wenn iSuccess=5);
    
     iReceive = ReadFTDI();   // <--- ***** FEHLERMELDUNG ********
    
     while (iReceive == 5)
     {
      if (iReceive == 245)
       {
        iSuccess++;
        Memo->Lines->Add("uC Request: " + IntToStr(iSuccess) + "x mal erhalten");
        WriteFTDI(246);  // Reply
        Memo->Lines->Add("Reply an uC gesendet");
       }
       else
       {
        Memo->Lines->Add("uC Request nicht erhalten");
       }
     }
    
     return bSync; // Rückgabe des Status ob Sync erfolgreich oder nicht
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TFormMain::ButtonSyncStartClick(TObject *Sender) //Button zur synchronisation
    {
     MemoDebug->Lines->Add("--- SyncUSB gestartet ---");
     if(SyncUSB() == 1)     Memo->Lines->Add("Sync OK !!!");
      else                          Memo->Lines->Add("Sync fehlgeschlagen!");
    }
    //---------------------------------------------------------------------------
    

    hoffe das hier ist halbwegs übesichtlich. wenn möglich bitte die änderung und vorschläge am source code anwenden!
    danke
    uj



  • usb-freak schrieb:

    Das Problem: die Fuktion ReadFTDI() liefert mir nichts zurück. wie kann ich aber meine Synchronisation machen. muss ich einen rückgabetyp wählen, wenn ja, welcher?

    nimm einfach 'int' als rückgabewert. ist er positiv dann ist es die anzahl empfangener bytes. 0 heisst nix empfangen und für negative werte definierst du ein paar statusmeldungen und/oder fehlercodes.



  • ich könnte aber auch die funktion void machen (also nichts zurückgeben), und die daten über eine globale variable (oder sogar array) zuweisen, die ich in der funktion erhalte?

    thx
    usb-freak



  • usb-freak schrieb:

    ich könnte aber auch die funktion void machen (also nichts zurückgeben), und die daten über eine globale variable (oder sogar array) zuweisen, die ich in der funktion erhalte?

    klar, es gibt immer mehrere möglichkeiten.



  • usb-freak schrieb:

    ich könnte aber auch die funktion void machen (also nichts zurückgeben), und die daten über eine globale variable (oder sogar array) zuweisen, die ich in der funktion erhalte?

    vorallem wenn ich mehrere rückgabewerte habe, oder?



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • usb-freak schrieb:

    vorallem wenn ich mehrere rückgabewerte habe, oder?

    bei mehreren rückgabewerten könnteste z.b. eine struct von der funktion füllen lassen, so etwa:

    struct __result
    {
       int r1;
       long r2;
       ....
    };
    
    // deine funktion
    void f (struct result *r)
    {
       ...
       r->r1 = ...
       r->r2 = ...
       r->... = ...
    }
    
    // aufrufer
    ...
    struct result r;
    f(&r);
    ...
    

    aber es gibt natürlich noch andere möglichkeiten.
    btw: globale variablen würde ich nicht nehmen, nur wenn's gar nicht anders geht.



  • wenn ich zum beispiel eine abfrage der synchronisation habe, dann mach ich das mit einer funktion die mir 1 werte vom usb-teil holt.... was aber wenn genau dieser eine wert nicht zur synchronisation passt? - dann gibts keine synchroniasation. (der wert der zur synchronisation passt wäre zum beispiel genau der nächste gewesen der vom usb-teil stammt).

    wie löst man dieses problem am besten, mit schleifen und arrays (buffer)?
    danke



  • usb-freak schrieb:

    wie löst man dieses problem am besten, mit schleifen und arrays (buffer)

    kommt drauf an. wenn das teil viele daten erzeugt aber regelmässig pausen macht, dann wäre ein (fifo)buffer nicht schlecht. wenn du den gross genug dimensionierst und regelmässig ausliest sollte das gehen. ohne buffer musst du wohl, wenn die synchronisation ausser tritt kommt, alles wegschmeissen bis du wieder 'in sync' bist. aber da sind nur vermutungen denn ich kenne ja deine umgebungsbedingungen nicht. möglicherweise buffert schon das betriebssystem o.ä....



  • derzeit gibts nur eine sync wenn die programme auf µC und pc "zufällig" gleichzeitig starten, und die sync-routinen zur gleichen zeit ablaufen.

    beim programm start des µc geht dieser sofort in das sync-unterprogramm, d.h. diser schickt immer die anfrage für die sync an den pc.
    der pc liest das fifo teil nach der funktion sync() wie im ersten post.


Log in to reply