Szybkosc F232/245 VCP vs DXX - Page 2

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
Re: Szybkosc F232/245 VCP vs DXX
Quoted text here. Click to load it

Dla FT232RL bez problemu realizowałem wysyłanie danych z prędkością ponad
300kbaud (~30kB/s) i odbieranie z prędkością 1Mbaud (~100kB/s) zarówno przez
VCP jak i D2xx. FT245 działa nieco inaczej. W/g dokumentacji przez VCP max.
300kB/s, przez D2xx 1MB/s. Tylko pytanie czym i jak odbierasz dane z FT245.
Nieodbieranie danych powoduje szybkie zapełnienie jedynie 128 Bajtowego
bufora sprzętowego i nieprzyjmowanie kolejnych danych. Nóżka RXF# w stanie
Lo sygnalizuje obecność danych w buforze, wtedy każdy kolejny Bajt odczytuje
się podając impuls na nóżkę RD#. Jeżeli dołączony do FT245 mikroprocesor
robi to wolno to wtedy on jest wąskim gardłem w tym projekcie. Możliwe, że
to on ogranicza prędkość odbioru danych do 1200B/s.
Do wysyłania danych służy funkcja
FT_Write (FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD
lpdwBytesWritten)
Kontroluj czy zwraca ona FT_OK i czy liczba bajtów rzeczywiście wysłanych
równa się ilości bajtów zadeklarowanych do wysłania.




Re: Szybkosc F232/245 VCP vs DXX
Quoted text here. Click to load it


przez DXX atmega odbiera dane poprawnie nawet taktowana 1MHz, sprawdzone ,
problem jest jak zmienie program wysylajacy dane z pc

ponizej wkleilem fragmenty kodu ktore pochodza z ksiazki , te fragmenty
wklepalem do swojego programu , ale przez VCP jest jak jest
zmiana baudrate dcb.BaudRate = CBR_19200 na inna wartosc ,  dla ft245 nic nie
daje
podmienie ft245 na ft232 i zobacze








#define cbOutQueue 1024          //rozmiar bufora danych wyjściowych
#define cbInQueue  1024          //rozmiar bufora danych wejściowych

//--------------------------------------------------------------------
TForm1 *Form1;

    HFILE   hfile_s;              // identyfikator pliku źródłowego
    char    Buffer_O[cbOutQueue]; // bufor danych wyjściowych
    char    Buffer_I[cbInQueue];  // bufor danych wejściowych
    DWORD   Number_Bytes_Read;    // Number bytes to read -
                                  // liczba bajtów do czytania
    HANDLE  hCommDev;             // identyfikator portu
    LPCTSTR lpFileName;           // wskaźnik do nazwy portu
    DCB     dcb;               // struktura kontroli portu szeregowego
    DWORD   fdwEvtMask;        // informacja o aktualnym stanie
                               // transmisji
    COMSTAT Stat;              // dodatkowa informacja o zasobach
                               // portu
    DWORD   Errors;            // reprezentuje typ ewentualnego błędu
//--------------------------------------------------------------------
int __fastcall Close_Comm(HANDLE hCommDev)
{
    CloseHandle(hCommDev);
    return TRUE;
}
//--------------------------------------------------------------------

int __fastcall Write_Comm(HANDLE hCommDev,
                           DWORD nNumberOfBytesToWrite)
{
   DWORD NumberOfBytesWritten;

   if (WriteFile(hCommDev, &Buffer_O[0], nNumberOfBytesToWrite,  
                 &NumberOfBytesWritten, NULL) > 0)
     {
        WaitCommEvent(hCommDev, &fdwEvtMask, NULL);

        return TRUE;
     }
     else
       return FALSE;
}
//--------------------------------------------------------------------
int __fastcall Read_Comm(HANDLE hCommDev,  
                         LPDWORD lpNumberOfBytesRead, DWORD Buf_Size)
{
    DWORD nNumberOfBytesToRead;

    ClearCommError(hCommDev, &Errors ,&Stat);

    if (Stat.cbInQue > 0)
      {
        if (Stat.cbInQue > Buf_Size)
            nNumberOfBytesToRead = Buf_Size;
          else
            nNumberOfBytesToRead = Stat.cbInQue;

        ReadFile(hCommDev, &Buffer_I[0], nNumberOfBytesToRead,
                 lpNumberOfBytesRead, NULL);
      }
      else
        *lpNumberOfBytesRead = 0;
    return TRUE;
}

//------------wstępny odczyt pliku z dysku----------------------------
void __fastcall TForm1::FileListBox1Change(TObject *Sender)
{
    memset(Buffer_O, 0, cbOutQueue);
    hfile_s = _lopen(FileListBox1->FileName.c_str(), OF_READ);

    if (hfile_s != HFILE_ERROR)
       _lread(hfile_s, &Buffer_O[0], cbOutQueue);

    for (int i = 0; i <= cbOutQueue - 1; i++)
      if (Buffer_O[i] == NULL)
         Buffer_O[i] = '.';

    Memo1->Text = Buffer_O;
    Memo2->Text = Buffer_O;

    _lclose(hfile_s);
}
//-----------------zamknięcie portu i aplikacji-----------------------
void __fastcall TForm1::CloseCommClick(TObject *Sender)
{
     Close_Comm(hCommDev);
     Application->Terminate();
}
//---------------inicjalizacja portu----------------------------------
void __fastcall TForm1::OpenCommClick(TObject *Sender)
{

    if (CheckBox1->Checked == TRUE)            // wybór portu
        lpFileName = "COM1";
    if (CheckBox2->Checked == TRUE)
        lpFileName = "COM2";

    hCommDev = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE,
                          0, NULL, OPEN_EXISTING, 0, NULL);

    if (hCommDev != INVALID_HANDLE_VALUE)   // sprawdza, czy port jest
                                            // otwarty prawidłowo
      {
        SetupComm(hCommDev, cbInQueue, cbOutQueue);
        dcb.DCBlength = sizeof(dcb);
        GetCommState(hCommDev, &dcb);

        if (CheckBox3->Checked == TRUE)            // wybór prędkości
          dcb.BaudRate = CBR_1200;                 // transmisji
        if (CheckBox4->Checked == TRUE)
          dcb.BaudRate = CBR_19200;  // dla ft245 zmiana baudrate     nic nie
daje

          dcb.Parity = ODDPARITY;            // ustawienie parzystości
          dcb.StopBits = ONESTOPBIT;         // bity stopu
          dcb.ByteSize = 7;                  // bity danych

        //-przykładowe ustawienia flag sterujących DCB-
          dcb.fParity = TRUE;               // sprawdzanie parzystości
          dcb.fDtrControl = DTR_CONTROL_DISABLE;                              
                  
          dcb.fRtsControl = RTS_CONTROL_DISABLE;                              
                
          dcb.fOutxCtsFlow = FALSE;
          dcb.fOutxDsrFlow = FALSE;
          dcb.fDsrSensitivity = FALSE;
          dcb.fAbortOnError = FALSE;
          dcb.fOutX = FALSE;
          dcb.fInX = FALSE;
          dcb.fErrorChar = FALSE;
          dcb.fNull = FALSE;

        SetCommState(hCommDev, &dcb);

        GetCommMask(hCommDev, &fdwEvtMask);
        SetCommMask(hCommDev, EV_TXEMPTY);

      }
      else
        {
         switch ((int)hCommDev)
           {
            case IE_BADID:
              MessageBox(NULL, "Niewłaściwa nazwa portu lub port jest"
                         " aktywny.", "Błąd", MB_OK);
            break;
           };
         }
}
//----------------wysłanie pliku--------------------------------------
void __fastcall TForm1::SendClick(TObject *Sender)
{
    DWORD  FileSizeHigh;

    ProgressBar1->Max = 0;

    if (hCommDev > 0)
      {
      memset(Buffer_O, 0, cbOutQueue);

      if ((_lopen(FileListBox1->FileName.c_str(),OF_READ)) !=
                  HFILE_ERROR)
        {
         hfile_s = _lopen(FileListBox1->FileName.c_str(), OF_READ);
         ProgressBar1->Max=GetFileSize((HANDLE)hfile_s,
                                       &FileSizeHigh);

         while (_lread(hfile_s, &Buffer_O[0], 1))
           {
            Write_Comm(hCommDev, 1);
            ProgressBar1->StepIt();
           }
         _lclose(hfile_s);

         FlushFileBuffers(hCommDev);
        }
        else
          MessageBox(NULL, "Nie wybrano pliku do transmisji.",
                     "Błąd !", MB_OK);
      }
      else
        MessageBox(NULL, "Niewłaściwa nazwa portu lub port jest"
                   " aktywny.", "Błąd", MB_OK);
}

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Re: Szybkosc F232/245 VCP vs DXX
On Wed, 16 Jun 2010 01:26:38 +0200,  nenik wrote:
Quoted text here. Click to load it
daje
Quoted text here. Click to load it

A dodaj tu zero. 10240


J.


Re: Szybkosc F232/245 VCP vs DXX
Quoted text here. Click to load it


Proponuję zmienić:

Większy bufor systemowy na dane (w stosunku do twojego bufora na dane do
wysłania) nieco poprawi sprawność komunikacji:
SetupComm(hCommDev, 2*cbInQueue, 2*cbOutQueue);

Być może poniższe ustawienia nie mają wpływu na FT245, ale można spróbować
zmienić zwłaszcza ilość bitów z 7 na 8, bo nie sądzę by plik miał dane
7-bitowe:
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
dcb.fParity = FALSE;

Zwiększyć ilość danych wysyłanych w jednej paczce (maksymalnie tyle co twoj
bufor czyli cbOutQueue). Nie jestem pewien czy zapisałem to dobrze w C.
DWORD RCount; //rzeczywista ilość danych odczytanych w pojedynczej paczce z
pliku
while ( RCount = _lread(hfile_s, &Buffer_O[0], cbOutQueue))
{
    Write_Comm(hCommDev, RCount);
     ProgressBar1->StepIt();
}




Re: Szybkosc F232/245 VCP vs DXX
Quoted text here. Click to load it

I jeszcze w funkcji Write_Comm zmieniłbym linijkę:
WaitCommEvent(hCommDev, &fdwEvtMask, NULL);
na bezpieczniejszy zapis:
do
{
  ClearCommError(hCommDev, &Errors ,&Stat);
}
while ( Stat.cbOutQue > 0 );




Re: Szybkosc F232/245 VCP vs DXX
W TForm1::Click zapisujesz po jednym bajcie:

          while (_lread(hfile_s, &Buffer_O[0], 1))
            {
             Write_Comm(hCommDev, 1);
             ProgressBar1->StepIt();
            }

Odczytaj caly plik do bufora (odpowiednio duzego) i wyslij go JEDNYM
wywolanie Write_Comm - wysylanie bajt po bajcie to proszenie sie o wolny
transfer (bo tak dzialaja biblioteki FTDI). Jesli wysylasz pakiet z 64
bajtami danych, to AFAIR domyslnie zakladane jest ze zaraz po nim (a nie
1ms pozniej) bedzie nastepny pakiet - powinienes miec duzo szybszy transfer.


--
Jerry1111

Re: Szybkosc F232/245 VCP vs DXX
Quoted text here. Click to load it

Dzieki za pomoc . Ostatecznie mam ft245 sterowane przez DXX , myslalem ze to
trudne a to az :)  5 linijek kodu plus jakas tablica .
Transfer to 600kB/sek dla  atmegi taktowanej 8MHz , przy 16M pewnie bedzie
niewiele wiecej ale wystarczy .

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Site Timeline