Szybkosc F232/245 VCP vs DXX

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

Reply to
nenik
Loading thread data ...

A dodaj tu zero. 10240

J.

Reply to
J.F.

Nieprawda.

Dokladnie.

Reply to
Jerry1111

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.
Reply to
Jerry1111

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 .

Reply to
nenik

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.