unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
RichEdit1: TRichEdit;
RichEdit2: TRichEdit;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
const
// -- wartości flag sterujących portu szeregowego --
dcb_fBinary = $0001;
dcb_fParity = $0002;
dcb_fOutxCtsFlow = $0004;
dcb_fOutxDsrFlow = $0008;
// -- fDtrControl --
DTR_CONTROL_ENABLE = $0010;
DTR_CONTROL_HANDSHAKE = $0020;
dcb_fDsrSensitivity = $0040;
dcb_fTXContinueOnXoff = $0080;
dcb_fOutX = $0100;
dcb_fInX = $0200;
dcb_fErrorChar = $0400;
dcb_fNull = $0800;
// -- fRtsControl --
RTS_CONTROL_ENABLE = $1000;
RTS_CONTROL_HANDSHAKE = $2000;
RTS_CONTROL_TOGGLE = $3000;
dcb_fAbortOnError = $4000;
var
Buffer_O : Char; // bufor wyjściowy
Buffer_I : Char; // bufor wejściowy
Number_Bytes_Read : DWORD;
hCommDev : THANDLE;
lpFileName : PChar;
fdwEvtMask : DWORD;
Stat : TCOMSTAT;
Errors : DWORD;
dcb : TDCB;
KoniecRS : Boolean;
Odebrano : Boolean;
hThread_RF : THANDLE; // pseudoidentyfikator wątku
ThreadID_RF : Cardinal; // zmienna identyfikująca wątek
hThread_SF : THANDLE; // pseudoidentyfikator wątku
ThreadID_SF : Cardinal; // zmienna identyfikująca wątek
F : File of Byte;
Dana : Byte;
TypDana : Byte; //0-naglowek, 1-dane mmc, 2-koniec
FilePos : Longint;
DoWyslania : LongInt;
WielkoscPliku : LongInt;
BytesRead, BytesWritten: Integer;
NumberOfBytesWritten : DWORD;
Buf: array[1..32] of Char;
DoZapisu : Integer = 0;
LiczZapis: Integer = 0;
BufforPusty : Boolean = TRUE;
Wys : Integer;
Ode : Integer;
resourcestring
s1 = 'Niewłaściwa nazwa lub jest aktywny port ';
implementation
{$R *.dfm}
function RS_SendFile(P: Pointer): Integer;
begin
while KoniecRS do
begin
if Odebrano then
begin
Odebrano:=FALSE;
Buffer_O:=#10;
WriteFile(hCommDev, Buffer_O, SizeOf(Buffer_O),
NumberOfBytesWritten, NIL);
WaitCommEvent(hCommDev, fdwEvtMask, NIL);
//TransmitCommChar (hCommDev, Char(10)); //to też testowałem
end;
end;
end;
function RS_ReciveFile(P: Pointer): Integer;
begin
while KoniecRS do
begin
ClearCommError(hCommDev, Errors, @Stat);
if (Stat.cbInQue > 0) then
begin
ReadFile(hCommDev, Buffer_I, 1,
Number_Bytes_Read, NIL);
if Number_Bytes_Read > 0 then
begin
Form1.RichEdit2.Text:=Form1.RichEdit2.Text+' '+IntToStr(Byte(Buffer_I));
Inc (Ode);
Form1.Label4.Caption:=IntToStr(Ode);
Odebrano:=TRUE;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
KoniecRS:=TRUE;
Odebrano:=TRUE;
Wys:=0;
Ode:=0;
FilePos:=0;
AssignFile (F, 'C:\TEMP.TXT');
Reset (F);
WielkoscPliku:=FileSize(F)-1;
DoWyslania:=8+WielkoscPliku+1;
lpFileName := 'COM1';
hCommDev := CreateFile(lpFileName, GENERIC_READ or
GENERIC_WRITE,0, NIL,
OPEN_EXISTING, 0, 0);
if (hCommDev <> INVALID_HANDLE_VALUE) then
begin
SetupComm(hCommDev, 1, 1);
dcb.DCBlength := sizeof(dcb);
GetCommState(hCommDev, dcb);
dcb.BaudRate := CBR_115200;
dcb.Parity := NOPARITY;
dcb.StopBits := ONESTOPBIT;
dcb.ByteSize := 8;
SetCommState(hCommDev, dcb);
GetCommMask(hCommDev, fdwEvtMask);
SetCommMask(hCommDev, EV_TXEMPTY);
hThread_RF := BeginThread (NIL, 0, @RS_ReciveFile,
NIL, 0, ThreadID_RF);
hThread_SF := BeginThread (NIL, 0, @RS_SendFile,
NIL, 0, ThreadID_SF)
end
else
case hCommDev of
IE_BADID: MessageDlg(s1 + lpFileName,
mtError, [mbOk], 0);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
KoniecRS:=FALSE;
SuspendThread(ThreadID_SF);
SuspendThread(ThreadID_RF);
CloseHandle(hCommDev);
CloseFile (F);
end;
end.