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