RTV forum PL | NewsGroups PL

Prędkość transferu VCP w F232/245: Jak osiągnąć ponad 1200 B/s?

Szybkosc F232/245 VCP vs DXX

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Prędkość transferu VCP w F232/245: Jak osiągnąć ponad 1200 B/s?

Goto page Previous  1, 2

J.F.
Guest

Tue Jun 15, 2010 6:48 pm   



On Tue, 15 Jun 2010 12:57:19 +0200, Zbych wrote:
Quote:
J.F. pisze:
Ale zaraz - 245 nie jest jakos inaczej obslugiwana ?
Jest dokładnie tak samo obsługiwany jak 232. Tylko zmiana prędkości na
nic nie wpływa.
No wlasnie .. czyli od czegos innego predkosc zalezy..

Tak, od prędkości elektronów Smile. Przecież to działa jak fifo. Im
szybciej odbierzesz dane, tym szybciej komputer będzie mógł przesłać
nowy pakiet.

No wlasnie .. wiec czemu koledzy sie na jakis boach skupiaja ?

J.

Jerry1111
Guest

Tue Jun 15, 2010 7:30 pm   



On 15/06/2010 10:47, Konop wrote:
Quote:
A wysylasz z PCta caly rekord danych jednym poleceniem Write, zeby PC
wyslal to jednym ciagiem przez USB (czyli pakiet 64B i kontynuacja),
czy uzywasz wiele Write z niewielkimi ilosciami danych? W drugim
przypadku mozesz miec tylko 64B/ms.

64B/ms ~= 64kB/s, a autor ma ok. 1,2kB/s, czyli znacznie, znacznie mniej

Moze wysyla po jednym bajcie.

--
Jerry1111

Jerry1111
Guest

Tue Jun 15, 2010 7:36 pm   



On 15/06/2010 00:43, nenik wrote:
Quote:
I teraz chcialbym napisac wlasny program , wiec cwicze w builderze , wybralem
droge przez VCP.

Powinno byc bez problemow. Wklej kawalek kodu ktory wysyla dane.

Quote:
Nie ukrywam to jest moj pierwszy program , nie wszystko
rozumiem , obsluge portu com mam z ksiazki , obsluga znak po znaku jest
realizowana przez funkcje pobierajaca jeden znak a obsluga wysylania paczk
ibitow przez flush czyli po mojemu wyslanie bufora do portu.

Jaki flush? Otwierasz port i uzywasz WriteFile, np tak:

WriteFile(hComPort, cmd->recvdString, strlen(cmd->recvdString),
&byteswritten, NULL);

Quote:
Chcialbym sie
dowiedziec czy dalej warto kombinowac przez VCP , potrzebuje max 80kB czyli
640kb/sek .

Powinno sie dac - zakladajac ze elektronika odbiera to wystarczajaco
szybko (a chyba odbiera skoro masz program ktory daje rade).

Quote:
W bibliotece DXX znalazlem #define FT_BAUD_921600 , przez VCP jest wolniej wiec
o nim moge chyba zapomniec .

FT_BAUD jest dla 232, 245 dziala rownolegle.

Quote:
Nie wiem skad wziela sie informacja rzedu 4MB przez DXX , tak sie chyba nie da .

Da sie.

--
Jerry1111

Zbych
Guest

Tue Jun 15, 2010 9:26 pm   



J.F. pisze:
Quote:
On Tue, 15 Jun 2010 12:57:19 +0200, Zbych wrote:
J.F. pisze:
Ale zaraz - 245 nie jest jakos inaczej obslugiwana ?
Jest dokładnie tak samo obsługiwany jak 232. Tylko zmiana prędkości na
nic nie wpływa.
No wlasnie .. czyli od czegos innego predkosc zalezy..
Tak, od prędkości elektronów Smile. Przecież to działa jak fifo. Im
szybciej odbierzesz dane, tym szybciej komputer będzie mógł przesłać
nowy pakiet.

No wlasnie .. wiec czemu koledzy sie na jakis boach skupiaja ?

Może są ofiologami?

Konop
Guest

Tue Jun 15, 2010 9:57 pm   



Quote:
Moze wysyla po jednym bajcie.

No ale chyba sterownik bajty wysłane w jednym "okienku" 1ms zbierze do
kupy i pośle "paczką", prawda??
W sumie - nieważne. Póki nie ma kodu, to to jest tylko gdybanie...

--
Pozdrawiam
Konop

nenik
Guest

Tue Jun 15, 2010 11:26 pm   



Quote:
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

J.F.
Guest

Wed Jun 16, 2010 6:42 am   



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

AS
Guest

Wed Jun 16, 2010 9:15 am   



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

AS
Guest

Wed Jun 16, 2010 9:56 am   



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

Jerry1111
Guest

Wed Jun 16, 2010 6:48 pm   



On 15/06/2010 22:57, Konop wrote:
Quote:
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.

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

Dokladnie.

--
Jerry1111

Jerry1111
Guest

Wed Jun 16, 2010 6:54 pm   



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

nenik
Guest

Sat Jun 19, 2010 12:04 am   



Quote:
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 Smile 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

Goto page Previous  1, 2

elektroda NewsGroups Forum Index - Elektronika Polska - Prędkość transferu VCP w F232/245: Jak osiągnąć ponad 1200 B/s?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map