eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaSzybkosc F232/245 VCP vs DXXRe: Szybkosc F232/245 VCP vs DXX
  • Data: 2010-06-15 23:26:38
    Temat: Re: Szybkosc F232/245 VCP vs DXX
    Od: "nenik" <n...@o...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    > 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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: