-
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