⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commx.pas

📁 日语版232串口的通信用控件源代码
💻 PAS
📖 第 1 页 / 共 3 页
字号:
//                                                                      //
//**********************************************************************//
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 + -