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.
type
TBuffer = array[0..20] of byte;
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);
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;
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)
Source: https://habr.com/ru/post/120183/
All Articles