📄 commx.pas
字号:
// //
//**********************************************************************//
TCommX = class(TCustomCommX)
published
property PortNo;
property BitRate;
property CharSize;
property ParityBit;
property StopBit;
property FlowCtrl;
property TimeOutTrans;
property TimeOutReceive;
property BufLenTrans;
property BufLenReceive;
property Handle;
property OnReceive;
property OnBreak;
property OnError;
end;
procedure Register;
implementation
//**********************************************************************//
// //
// 掕悢偺掕媊 //
// //
//**********************************************************************//
const
// 傾僗僉乕僐乕僪
XON = $11;
XOFF = $13;
// 捠怣僄儔乕僀儀儞僩偺儅僗僋
ERR_MASK = CE_FRAME or CE_OVERRUN or CE_RXPARITY;
// 巊梡偡傞僀儀儞僩偺儅僗僋
EV_MASK = EV_RXCHAR or EV_BREAK or EV_ERR;
// 儐乕僓乕僂傿儞僪僂儊僢僙乕僕
WM_COMM_RECEIVE = WM_USER + $100 + 0;
WM_COMM_BREAK = WM_USER + $100 + 1;
WM_COMM_ERR = WM_USER + $100 + 2;
// 僗儗僢僪儊僢僙乕僕
TM_COMMTRANS = WM_USER + $100 + 0;
// 僼儘乕惂屼偺僙僢僩撪梕
DCB_CTS_FLOW = $00000004;
DCB_DSR_FLOW = $00000008;
DCB_DTR_ENABLE = $00000010;
DCB_DTR_HANDSHAKE = $00000020;
DCB_OUT_XON_XOFF = $00000100;
DCB_IN_XON_XOFF = $00000200;
DCB_RTS_ENABLE = $00001000;
DCB_RTS_HANDSHAKE = $00002000;
//**********************************************************************//
// //
// 乣 僐儞億乕僱儞僩嶌惉 乣 //
// //
//**********************************************************************//
constructor TCustomCommX.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if not (csDesigning in ComponentState) then begin
FHWnd := AllocateHWnd(WndProc);
end;
FHandle := INVALID_HANDLE_VALUE; // 僴儞僪儖傪弶婜壔
TransThread := Nil; // 憲怣梡僗儗僢僪
ReceiveThread := Nil; // 庴怣梡僗儗僢僪
FPortNo := 1; // 捠怣億乕僩斣崋
FBitRate := 9600; // 捠怣懍搙乮倐倫倱乯
FCharSize := 8; // 侾暥帤偺價僢僩悢
FParityBit := cpbNone; // 僷儕僥傿僠僃僢僋偺曽幃
FStopBit := csb1; // 僗僩僢僾價僢僩悢
FFlowCtrl := cfcRtsCts; // 僼儘乕惂屼曽幃
FTimeOutTrans := 3000; // 憲怣僞僀儉傾僂僩帪娫乮倣倱乯
FTimeOutReceive := 3000; // 庴怣僞僀儉傾僂僩帪娫乮倣倱乯
FBufLenTrans := 2048; // 憲怣僶僢僼傽挿
FBufLenReceive := 2048; // 庴怣僶僢僼傽挿
FDCB.DCBLength := Sizeof(TDCB); // 俢俠俛峔憿懱偺僒僀僘
with RecvOverLap do begin // 庴怣梡僆乕僶乕儔僢僾峔憿懱
Internal := 0;
InternalHigh := 0;
Offset := 0;
OffsetHigh := 0;
hEvent := 0;
end;
TransBufLen := 0; // 憲怣懸婡僶僀僩悢
TransCnt := 0; // 憲怣僉儏乕偵憲偭偨夞悢
FOnReceive := Nil; // 庴怣捠抦僀儀儞僩
FOnError := Nil; // 捠怣僄儔乕僀儀儞僩
FOnBreak := Nil; // 僽儗乕僋怣崋僀儀儞僩
InitializeCriticalSection(Critical1); // 僋儕僥傿僇儖僙僋僔儑儞偺弶婜壔
InitializeCriticalSection(Critical2); // 僋儕僥傿僇儖僙僋僔儑儞偺弶婜壔
end;
//**********************************************************************//
// //
// 乣 僐儞億乕僱儞僩攋婞 乣 //
// //
//**********************************************************************//
destructor TCustomCommX.Destroy;
begin
if FHandle <> INVALID_HANDLE_VALUE then begin
PortClose;
end;
if not (csDesigning in ComponentState) then begin
DeAllocateHWnd(FHWnd);
end;
DeleteCriticalSection(Critical1); // 僋儕僥傿僇儖僙僋僔儑儞偺廔椆
DeleteCriticalSection(Critical2); // 僋儕僥傿僇儖僙僋僔儑儞偺廔椆
inherited Destroy;
end;
//**********************************************************************//
// //
// 乣 捠怣億乕僩偺僆乕僾儞 乣 //
// //
// - input - 側偟 //
// - output - 側偟 //
// //
//**********************************************************************//
procedure TCustomCommX.PortOpen;
var
PortName : array [0..15] of Char;
begin
if FHandle <> INVALID_HANDLE_VALUE then begin
raise ECommError.Create('億乕僩偼丄偡偱偵僆乕僾儞偝傟偰偄傑偡');
end;
StrPCopy(PortName, 'COM' + IntToStr(FPortNo)); // 億乕僩柤偺嶌惉
FHandle := CreateFile(PortName, // 億乕僩柤
GENERIC_READ or // 撉傒崬傒傾僋僙僗
GENERIC_WRITE, // 彂偒崬傒傾僋僙僗
0, // 嫟桳偺懳徾偲偟側偄
Nil, // 僙僉儏儕僥傿懏惈側偟
OPEN_EXISTING, // 僆乕僾儞乮捠怣偱偼昁偢偙偺愝掕乯
FILE_FLAG_OVERLAPPED, // 僆乕僶乕儔僢僾擖弌椡傪峴偆
0); // 僥儞僾儗乕僩僼傽僀儖傾僋僙僗側偟
if FHandle = INVALID_HANDLE_VALUE then begin
raise ECommError.Create('億乕僩傪僆乕僾儞偱偒傑偣傫偱偟偨');
end;
try
TransBufLen := 0; // 憲怣懸婡僶僀僩悢
TransCnt := 0; // 憲怣僉儏乕偵憲偭偨夞悢
SetBufferLength; // 憲庴怣僶僢僼傽挿偺愝掕
PurgeComm(FHandle, PURGE_TXABORT or PURGE_TXCLEAR); // 憲怣僶僢僼傽傪攋婞
PurgeComm(FHandle, PURGE_RXABORT or PURGE_RXCLEAR); // 庴怣僶僢僼傽傪攋婞
GetCommState(FHandle, FDCB); // 尰嵼偺TDCB偺庢摼
FDCB.XonChar := Char(XON); // XON暥帤
FDCB.XoffChar := Char(XOFF); // XOFF暥帤
FDCB.ErrorChar := #$00; // 僄儔乕偺偲偒戙傢傝偺暥帤
SetBitRate(FBitRate); // 捠怣懍搙乮儃乕儗乕僩乯偺愝掕
SetCharSize(FCharSize); // 侾僉儍儔僋僞偺價僢僩悢偺愝掕
SetParityBit(FParityBit); // 僷儕僥傿僠僃僢僋偺曽幃偺愝掕
SetStopBit(FStopBit); // 僗僩僢僾價僢僩悢偺愝掕
SetFlowCtrl(FFlowCtrl); // 僼儘乕惂屼曽幃偺愝掕
SetTimeOut; // 憲庴怣僞僀儉傾僂僩帪娫偺愝掕
SetCommMask(FHandle, EV_MASK); // 巊梡偡傞僀儀儞僩偺愝掕
ReadHandle := CreateEvent(Nil, True, False, Nil); // 撉傒崬傒廔椆僔僌僫儖
RecvOverLap.hEvent := ReadHandle; // 庴怣梡僆乕僶乕儔僢僾峔憿懱
ThreadCreate; // 僗儗僢僪偺惗惉
except
PortClose; // 幐攕帪丄億乕僩僋儘乕僘
raise;
end;
end;
//----------------------------------------------------------------------//
// //
// 乣 僗儗僢僪偺惗惉 乣 //
// //
// - input - 側偟 //
// - output - 側偟 //
// //
//----------------------------------------------------------------------//
procedure TCustomCommX.ThreadCreate;
begin
TransThread := Nil; // 億僀儞僞偺弶婜壔
ReceiveThread := Nil; // 億僀儞僞偺弶婜壔
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -