рдЖрдЬ рд╣рдо COM-port (рд╕рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо RS232) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрдврд╝рддреЗ рд╕рдордп рднреЗрдЬрддрд╛ рд╣реИред
рдЖрдЗрдП рдбреЗрд▓реНрдлреА рдХрдВрдкреЛрдиреЗрдВрдЯ рдЬреИрд╕реЗ рдПрдХ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ:

рдЕрдЧрд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдореВрд▓ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ TEdit рдЪреБрдиреЗрдВред

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдШрдЯрдХ - TRS232Edit рдХреЛ рдПрдХ рдкреБрддреНрд░ рдХрд╛ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдШрдЯрдХ рдкреИрд▓реЗрдЯ (RS 232 - рдорд╛рдирдХ рдХрд╛ рдирд╛рдо) рдХреЗ MyCompords рд╕реЗрдЯ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред

рд╕рдорд╛рдкреНрдд рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдШрдЯрдХ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рджреЗрдВрдЧреЗ uRS232Edit.pas рдФрд░ рдЗрд╕реЗ рд╕рд╣реЗрдЬреЗрдВред рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдорд╛рд╣реМрд▓ рд╕реНрд╡рддрдГ рд╣реА рдРрд╕рд╛ рдЦрд╛рдХрд╛ рддреИрдпрд╛рд░ рдХрд░ рджреЗрдЧрд╛:
unit uRS232EANEdit;
interface
uses
SysUtils, Classes, Controls, StdCtrls;
type
TRS232Edit = class(TEdit)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyComponents', [TRS232Edit]);
end;
end.
рд╣рдо рдмрдВрджрд░рдЧрд╛рд╣ рд╕реЗ 20 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ (рдЕрдзрд┐рдХ рдФрд░ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ :))
type
TBuffer = array[0..20] of byte;
рд╣рдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд░рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, TRS232Edit рд╡рд░реНрдЧ рдХреЗ рдирд┐рдЬреА рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЙрди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ рдЬрд┐рдирдореЗрдВ рд╣рдо рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
cComPort : integer; //
cBaud : integer; // ()
cParity : integer; //
cCountBit : integer; //
cStopBit : integer; //
рд╣рдореЗрдВ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
CommHandle : integer; // COM-
DCB : TDCB; //
Ovr : TOverlapped; //
Stat : TComStat; //
CommThread : THandle; // ,
function DigitHex(aValue: Integer): Char;
function GetAsHexagonal(aValue: Integer): String; // 16-
function DecodeBarCode(buf : TBuffer; bufsize : integer) : string;
procedure PortInit;
procedure SetZero;
рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ
BarCode : string; // Text
constructor Create(AOwner:Tcomponent);override;
destructor Free;
procedure Init(comport, baud, parity, countbit, stopbit : integer);
Init рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреЛрд░реНрдЯ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реАрдзреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИред
procedure TRS232EANEdit.Init(comport, baud, parity, countbit, stopbit : integer);
begin
cComPort := comport;
cBaud := baud;
cParity := parity;
cCountBit := countbit;
cStopBit := stopbit;
SetZero;
PortInit;
end;
рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд░реБрдЪрд┐ рдкреЛрд░реНрдЯрдЗрдирд┐рдЯ рд╡рд┐рдзрд┐ рд╣реИ - рд╣рдо рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ
procedure TRS232EANEdit.PortInit;
var
ThreadID: dword ;
begin
//
CommHandle:= CreateFile(cComPort,GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
// - " "
SetCommMask(CommHandle,EV_RXFLAG);
// DCB
GetCommState(CommHandle, DCB);
//
DCB.BaudRate:=cBaud;
DCB.Parity:=cParity;
DCB.ByteSize:=cCountBit;
DCB.StopBits:=cStopBit;
DCB.EvtChar:=chr(13); // 0x0D
//
SetCommState(CommHandle,DCB);
/* , . - . BeginThread - CreateThread. @ReadComm - */
CommThread := BeginThread(nil,0,@ReadComm,Self,0,ThreadID);
end;
рдбреЗрдЯрд╛ ReadComm рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
procedure ReadComm(s : Pointer);
var
Resive : TBuffer;
a : TRS232EANEdit;
begin
a := s; // s -
while true do
begin
a.TransMask:=0;
WaitCommEvent(a.CommHandle,a.TransMask,@a.Ovr);
if (a.TransMask and EV_RXFLAG)=EV_RXFLAG then //
begin
ClearCommError(a.CommHandle,a.Errs,@a.Stat);
ReadFile(a.CommHandle, Resive, a.Stat.cbInQue, a.Stat.cbInQue, @a.Ovr);//
a.Text := a.DecodeBarCode(Resive, 20); // -
Application.ProcessMessages;
end;
end;
end;
рд╡рд╣ рд╕рдм рд╣реИред рд╕рдВрдХрд▓рд┐рдд, рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд░реАрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдпрд╣ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
RS232Edit1.Init(1, 9600, 0, 8, 1)