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