RSS


[ Pobierz całość w formacie PDF ]
.Zauważmy tubardzo ważną rzecz  plik transmitujemy bajt po bajcie! Chociaż standardowa wielkość blokutransmisji (rekordu) do bufora może wynieść nawet 4 kB, to w transmisji szeregowej zalecanąwielkością jest 1 bajt.Cóż, każdy plik składa się z całkowitych wielokrotności tej liczby.Jeżeliktoś ma wątpliwości, może ustalić rozmiar transferowanego bloku danych np.na 128 bajtów.Trzeba wówczas wykazać się dużą dozą cierpliwości aby zobaczyć końcowy efekt transferudanych choćby na sąsiednim komputerze.Treść funkcji obsługi zdarzenia wysyłającego plikzamieszczona jest poniżej.//----------wysyłanie pliku------------------------------void __fastcall TForm1::SendClick(TObject *Sender){DWORD FileSizeHigh;ProgressBar1->Max=0;133 .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)) // przeczytanie 1// bajta i umieszczenie go// w buforze wyjściowymWrite_Comm(hCommDev, 1); // transmisja 1 bajtaProgressBar1->StepIt();}_lclose(hfile_s);}.}Sposób odbioru przychodzących do naszego portu znaków będzie analogiczny do tego, jakizaprezentowaliśmy przy okazji odbioru łańcuchów.Kompletny kod głównego modułu RS_05.cppprojektu \KODY\BUILDER\RS_05\p_RS_05.bpr realizującego transmisję plików przedstawionyjest na wydruku 5.6.Rysunek 5.6.Formularz głównydziałającegoprojektup_RS_05.bpr134 Wydruk 5.6.Kod aplikacji realizującej transmisję plików.//--- kompilować z borlndmm.dll oraz cc3250mt.dll --------------//------RS_05.cpp----------#include#pragma hdrstop#include "RS_05.h"#pragma package(smart_init)#pragma resource "*.dfm"#define cbOutQueue 1024 //rozmiar bufora danych wyjściowych#define cbInQueue 1024 //rozmiar bufora danych wejściowych//--------------------------------------------------------------------TForm1 *Form1;HFILE hfile_s; // identyfikator pliku zródłowegochar Buffer_O[cbOutQueue]; // bufor danych wyjściowychchar Buffer_I[cbInQueue]; // bufor danych wejściowychDWORD Number_Bytes_Read; // Number bytes to read // liczba bajtów do czytaniaHANDLE hCommDev; // identyfikator portuLPCTSTR lpFileName; // wskaznik do nazwy portuDCB dcb; // struktura kontroli portu szeregowegoDWORD fdwEvtMask; // informacja o aktualnym stanie// transmisjiCOMSTAT Stat; // dodatkowa informacja o zasobach// portuDWORD 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;}elsereturn FALSE;}//--------------------------------------------------------------------int __fastcall Read_Comm(HANDLE hCommDev,LPDWORD lpNumberOfBytesRead, DWORD Buf_Size){DWORD nNumberOfBytesToRead;135 ClearCommError(hCommDev, &Errors ,&Stat);if (Stat.cbInQue > 0){if (Stat.cbInQue > Buf_Size)nNumberOfBytesToRead = Buf_Size;elsenNumberOfBytesToRead = Stat.cbInQue;ReadFile(hCommDev, &Buffer_I[0], nNumberOfBytesToRead,lpNumberOfBytesRead, NULL);}else*lpNumberOfBytesRead = 0;return TRUE;}//--------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}//--------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender){DirectoryListBox1->FileList = FileListBox1;DriveComboBox1->DirList = DirectoryListBox1;FileListBox1->FileEdit = Edit1;}//------------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 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 portulpFileName = "COM1";if (CheckBox2->Checked == TRUE)lpFileName = "COM2";136 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ścidcb.BaudRate = CBR_1200; // transmisjiif (CheckBox4->Checked == TRUE)dcb.BaudRate = CBR_19200;dcb.Parity = ODDPARITY; // ustawienie parzystościdcb.StopBits = ONESTOPBIT; // bity stopudcb.ByteSize = 7; // bity danych//-przykładowe ustawienia flag sterujących DCB-dcb.fParity = TRUE; // sprawdzanie parzystościdcb.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);137 if ((_lopen(FileListBox1->FileName.c_str(),OF_READ)) !=HFILE_ERROR){hfile_s = _lopen(FileListBox1->FileName [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • wblaskucienia.xlx.pl