eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › Szybkosc F232/245 VCP vs DXX
Ilość wypowiedzi w tym wątku: 27

  • 21. Data: 2010-06-15 23:26:38
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: "nenik" <n...@o...pl>

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


    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


  • 22. Data: 2010-06-16 06:42:57
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: J.F. <j...@p...onet.pl>

    On Wed, 16 Jun 2010 01:26:38 +0200, nenik wrote:
    >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

    A dodaj tu zero. 10240


    J.


  • 23. Data: 2010-06-16 09:15:02
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: "AS" <N...@p...onet.pl>

    > 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


    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();
    }




  • 24. Data: 2010-06-16 09:56:49
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: "AS" <N...@p...onet.pl>

    > 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();
    > }

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




  • 25. Data: 2010-06-16 18:48:43
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: Jerry1111 <j...@w...pl.pl.wp>

    On 15/06/2010 22:57, Konop wrote:
    >> Moze wysyla po jednym bajcie.
    >
    > No ale chyba sterownik bajty wysłane w jednym "okienku" 1ms zbierze do
    > kupy i pośle "paczką", prawda??

    Nieprawda.

    > W sumie - nieważne. Póki nie ma kodu, to to jest tylko gdybanie...

    Dokladnie.

    --
    Jerry1111


  • 26. Data: 2010-06-16 18:54:02
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: Jerry1111 <j...@w...pl.pl.wp>

    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


  • 27. Data: 2010-06-19 00:04:02
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: "nenik" <n...@o...pl>

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

    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

strony : 1 . 2 . [ 3 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: