亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcomm1.pas

?? RS232串口通訊隨書源碼
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit TComm1;

// 這是一個串行端口通信組件
// 簡單傳輸. 此組件調用 Win32 API 來達成所需功能

interface

uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
    extctrls,Dialogs,syncobjs;

type
    //類型定義
    TBaudRate = ( br110, br300, br600, br1200, br2400, br4800,
                       br9600, br14400, br19200, br38400, br56000,
                       br57600, br115200 );
    TComPortNumber = ( pnCOM1, pnCOM2, pnCOM3, pnCOM4, pnCOM5, pnCOM6, pnCOM7,
                     pnCOM8, pnCOM9, pnCOM10, pnCOM11, pnCOM12, pnCOM13,
                     pnCOM14, pnCOM15, pnCOM16 );
    TParity = ( None, Odd, Even, Mark, Space );
    TStopBits = ( SB1, SB1_5, SB2 );
    TDataBits = ( DB5, DB6, DB7, DB8 );
    THWHandShaking=(hhNone,hhNoneRTSON,hhRTSCTS);
    TSWHandShaking=(shNone,shXonXoff);
    //例外聲明
    ECommError = class( Exception );
    //事件函數定位器聲明
    TReceiveDataEvent = procedure(Sender: TObject) of object;
    TReceiveErrorEvent = procedure(Sender: TObject; EventMask : DWORD) of object;
    TModemStateChangeEvent = procedure(Sender: TObject; ModemEvent : DWORD) of object;


const
    // 輸入緩沖區的默認大小
     INPUTBUFFERSIZE = 4096;
     // Line Status位定義
     ME_CTS = 1;
     ME_DSR = 2;
     ME_RING = 4;
     ME_RLSD = 8;
     //DCB 位定義
    dcb_Binary              = $00000001;
    dcb_ParityCheck         = $00000002;
    dcb_OutxCtsFlow         = $00000004;
    dcb_OutxDsrFlow         = $00000008;
    dcb_DtrControlMask      = $00000030;
    dcb_DtrControlDisable   = $00000000;
    dcb_DtrControlEnable    = $00000010;
    dcb_DtrControlHandshake = $00000020;
    dcb_DsrSensivity        = $00000040;
    dcb_TXContinueOnXoff    = $00000080;
    dcb_OutX                = $00000100;
    dcb_InX                 = $00000200;
    dcb_ErrorChar           = $00000400;
    dcb_NullStrip           = $00000800;
    dcb_RtsControlMask      = $00003000;
    dcb_RtsControlDisable   = $00000000;
    dcb_RtsControlEnable    = $00001000;
    dcb_RtsControlHandshake = $00002000;
    dcb_RtsControlToggle    = $00003000;
    dcb_AbortOnError        = $00004000;
    dcb_Reserveds           = $FFFF8000;
type

    TComm = class( TComponent )
    private
      { Private declarations }
      CommTimer:          TTimer; //組件用的定時器
      szInputBuffer:      array[0..INPUTBUFFERSIZE-1] of Char;
      hComm:              THandle;
      FCommPort:          TComPortNumber;
      FPortOpen:          Boolean;
      FBaudRate:          TBaudRate;
      FParityCheck:       Boolean;
      FHwHandShaking:     THwHandShaking;
      FSwHandShaking:     TSwHandShaking;
      FDataBits:          TDataBits;
      FParity:            TParity;
      FStopBits:          TStopBits;
      FInputLen:          DWORD; //每次執行Input時所讀取的字符串長度
      FRThreshold:        DWORD;//設置引發接收事件的閥值
      FDTR:               Boolean;
      FRTS:               Boolean;
      FInputData:          String;
//      FByteNo:             DWORD; //已讀取的字節數
      FInputByteData:      array of Byte;
      FCommEvent:          DWORD;
      FCommError:          DWORD;
      FCDHolding:          Boolean;
      FCTSHolding:         Boolean;
      FDSRHolding:         Boolean;
      FRIHolding:          Boolean;

      //事件
      FOnReceiveData:     TReceiveDataEvent;
      FOnReceiveError:    TReceiveErrorEvent;
      FOnModemStateChange:TModemStateChangeEvent;

      //設置函數
      procedure SetBaudRate( Rate : TBaudRate ); //設置速率
      procedure SetHwHandShaking( c : THwHandShaking);//硬件交握
      procedure SetSwHandShaking( c : TSwHandShaking);//軟件交握
      procedure SetDataBits( Size : TDataBits );//數據位數
      procedure SetParity( p : TParity );//極性檢查
      procedure SetStopBits( Bits : TStopBits );//停止位
      procedure SetInDataCount(StrNo:DWORD);//設成0表示清除FInputData
      procedure SetRThreshold(RTNo:DWORD); //接收閥值
      procedure SetPortOpen(b:Boolean);//打開通信端口
      procedure _SetCommState;//設置通信參數
      procedure SetDTRStatus(b:Boolean);//DTR 狀態
      procedure SetRTSStatus(b:Boolean);//RTS狀態
      Procedure ReadProcess;//讀取數據函數
      Procedure GetModemState;//線路狀態檢測函數
      procedure OpenComm;//打開通信端口函數
      procedure CloseComm;//開關通信端口函數
      function  ReadCommEvent():DWORD; //硬件線路狀態值讀取
      function  ReadCommError():DWORD; //錯誤狀態值的讀取
      function  ReadInputData():String;//返回收到的數據
      function  ReadInDataCount():DWORD;//讀取有多少數據
      function  ReadCDHolding:Boolean; //取得CD線路狀態
      function  ReadDSRHolding:Boolean;//取得DSR線路狀態
      function  ReadRIHolding:Boolean;//取得RI線路狀態
      function  ReadCTSHolding:Boolean;//取得CTS線路狀態

    protected
      //給子類繼承用
      procedure ProcTimer(Sender:TObject);
      procedure ReceiveData();
      procedure ReceiveError( EvtMask : DWORD );
      procedure ModemStateChange( ModemEvent : DWORD );
    public
      //給應用程序調用用
      property Handle: THandle read hComm;
      constructor Create( AOwner: TComponent ); override;
      destructor  Destroy; override;
      function    OutputString(DataToWrite: String): Boolean;
      function    OutputByte(const ByteData:array of Byte):Boolean;
      function    ReadInputByte(var AP:PByte):DWORD;
    published
      //屬性列表用
      property CommPort: TComPortNumber read FCommPort write FCommPort;
      property PortOpen:Boolean read FPortOpen write SetPortOpen;
      property BaudRate: TBaudRate read FBaudRate write SetBaudRate;
      property HwHandShaking: THwHandShaking read FHwHandShaking write SetHwHandShaking;
      property SwHandShaking: TSwHandShaking read FSwHandShaking write SetSwHandShaking;
      property DataBits: TDataBits read FDataBits write SetDataBits;
      property Parity: TParity read FParity write SetParity;
      property StopBits: TStopBits read FStopBits write SetStopBits;
      property CommEvent:DWORD read ReadCommEvent;
      property CommError:DWORD read ReadCommError;
      property Input:string read ReadInputData;
      property InputLen:DWORD read FInputLen write FInputLen;
      property RThreshold:DWORD read FRThreshold write SetRThreshold;
      property CDHolding:Boolean read ReadCDHolding;
      property DSRHolding:Boolean read ReadDSRHolding;
      property RIHolding:Boolean read ReadRIHolding;
      property CTSHolding:Boolean read ReadCTSHolding;
      property DTREnabled:Boolean read FDTR write SetDTRStatus;
      property RTSEnabled:Boolean read FRTS write SetRTSStatus;
      property DataCount:DWORD read ReadInDataCount write SetInDataCount;

      property OnReceiveData: TReceiveDataEvent
               read FOnReceiveData write FOnReceiveData;
      property OnReceiveError: TReceiveErrorEvent
               read FOnReceiveError write FOnReceiveError;
      property OnModemStateChange: TModemStateChangeEvent
               read FOnModemStateChange write FOnModemStateChange;
    end;

procedure Register;

implementation

(******************************************************************************)
//   TComm PUBLIC METHODS
(******************************************************************************)

constructor TComm.Create( AOwner: TComponent );
begin
     inherited Create( AOwner );
     CommTimer:=TTimer.Create(Self);
     CommTimer.Interval:=100;
     CommTimer.OnTimer:=ProcTimer;
     hComm := 0;        //通信端口Handle先清空
     FPortOpen:=False;
     FCommPort := pnCOM2; //默認COM2
     FBaudRate := br9600;   //9600bps
     FHwHandShaking := hhNone; //不激活硬件流量控制
     FSwHandShaking := shNone; //不激活軟件流量控制
     FDataBits := DB8;  //數據位數=8
     FParity := None;   //不作同位檢查
     FStopBits := SB1;   //停止位數=1
     FInputLen:=0;  //默認是一次執行全部讀取
     CommTimer.Enabled:=True;

end;

destructor TComm.Destroy;
begin
     CommTimer.Interval:=0;
     CommTimer.Enabled:=False; 
     inherited Destroy;
end;

//打開通信端口
procedure TComm.OpenComm;
var
   hNewCommFile:   THandle;
   ComStr:String;
begin
     ComStr:='COM' + IntToStr(1+ord(FCommPort));
     hNewCommFile := CreateFile( PChar(ComStr),
                                 GENERIC_READ or GENERIC_WRITE,
                                 0, {not shared}
                                 nil, {no security ??}
                                 OPEN_EXISTING,
                                 0,{No Overlapped}
                                 0 {template} );

     if hNewCommFile = INVALID_HANDLE_VALUE then
        raise ECommError.Create( 'Error opening serial port' );

     if not SetupComm( hNewCommFile, INPUTBUFFERSIZE, INPUTBUFFERSIZE ) then
     begin
          CloseHandle( hComm );
          raise ECommError.Create( 'Cannot setup comm buffer' );
     end;
     // It is ok to continue.
     hComm := hNewCommFile;
     // 清除湲沖區
     PurgeComm( hComm, PURGE_TXABORT or PURGE_RXABORT or
                           PURGE_TXCLEAR or PURGE_RXCLEAR ) ;
     // 通信端口組態
     _SetCommState;

{     // 設置事件屏蔽
     if not SetCommMask(hComm, EV_CTS or EV_DSR or EV_RLSD or EV_RING ) then
     begin
        MessageDlg('Set Comm Mask Error!', mtError, [mbOK], 0);
        exit ;
     end;}
     FPortOpen:=True;

end; {TComm.OpenComm}

//關閉通信端口
procedure TComm.CloseComm;
begin
     // No need to continue if we're not communicating.
     if hComm = 0 then
        Exit;
     // 實際關閉通信端口
     CloseHandle( hComm );
     FPortOpen:=False;
     hComm := 0
end;

//由通信端口送出字符串數據
function TComm.OutputString(DataToWrite: String ): Boolean;
var
  lrc:     LongWord;
  tmpChar: PChar;
begin

  if hComm=0 then
   begin
     MessageDlg('COM Port is not opened yet!', mtError, [mbOK], 0);
     Result := False;
     exit;
   end;
   // 送出數據
   tmpChar:=PChar(DataToWrite);
   if WriteFile(hComm,tmpChar^,Length(DataToWrite), lrc, nil) then
   begin
     Result:=True;
     exit;
   end;
   Result:=False;
end; {TComm.OutputString}

//傳送二進制的數據
function TComm.OutputByte(const ByteData: array of Byte ): Boolean;
var
  lrc:     LongWord;
    i:     Integer;
begin
  if hComm=0 then
   begin
     MessageDlg('COM Port is not opened yet!', mtError, [mbOK], 0);
     Result := False;
     exit;
   end;
      // 送出數據
   for i:=Low(ByteData) to High(ByteData) do
     WriteFile(hComm,ByteData[i],1,lrc, nil);
   Result := True;
end; {TComm.OutputByte}


//數據到達時的事件觸發
procedure TComm.ReceiveData();
begin
     if Assigned(FOnReceiveData) then
        FOnReceiveData(self)
end;

//接收錯誤時的事件觸發
procedure TComm.ReceiveError( EvtMask : DWORD );
begin
     if Assigned(FOnReceiveError) then
        FOnReceiveError( self, EvtMask )
end;

//線路狀態改變時的事件觸發
procedure TComm.ModemStateChange( ModemEvent : DWORD );
begin
     if Assigned(FOnModemStateChange) then
        FOnModemStateChange( self, ModemEvent )
end;

(******************************************************************************)
//  TComm PRIVATE 方法
(******************************************************************************)

//以下是通信參數的設置
procedure TComm._SetCommState;
var
   dcb:            Tdcb;
   tmpValue:       DWORD;
begin
     //取得串行端口設置
     GetCommState( hComm, dcb );
    //變更傳輸速率
    case FBaudRate of
     br110    : tmpValue := 110;
     br300    : tmpValue := 300;
     br600    : tmpValue := 600;
     br1200   : tmpValue := 1200;
     br2400   : tmpValue := 2400;
     br4800   : tmpValue := 4800;
     br9600   : tmpValue := 9600;
     br14400  : tmpValue := 14400;
     br19200  : tmpValue := 19200;
     br38400  : tmpValue := 38400;
     br56000  : tmpValue := 56000;
     br57600  : tmpValue := 57600;
    else
     {br115200 :} tmpValue := 115200;
    end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲777理论| 久久福利视频一区二区| 日韩欧美卡一卡二| av不卡免费在线观看| 性感美女久久精品| 中文字幕av一区二区三区高| 欧美久久高跟鞋激| 成人动漫视频在线| 激情综合亚洲精品| 五月婷婷激情综合网| 亚洲日穴在线视频| 国产日韩成人精品| 日韩美女一区二区三区四区| 欧美日韩成人激情| 91免费精品国自产拍在线不卡| 国产呦萝稀缺另类资源| 五月婷婷久久综合| 亚洲自拍另类综合| 亚洲婷婷综合色高清在线| 国产喂奶挤奶一区二区三区| 日韩视频一区二区| 欧美福利一区二区| 欧美在线视频全部完| 天天色天天爱天天射综合| 亚洲精品综合在线| 亚洲欧美中日韩| 国产精品污网站| 久久精子c满五个校花| 日韩美女主播在线视频一区二区三区| 欧美亚洲日本国产| 欧美影院精品一区| 欧美无砖砖区免费| 欧美日韩一区二区电影| 在线视频你懂得一区| 91丝袜呻吟高潮美腿白嫩在线观看| 高清beeg欧美| 不卡在线观看av| 不卡av在线免费观看| 成人av一区二区三区| 成人免费高清在线| 成人高清伦理免费影院在线观看| 国产成人在线视频免费播放| 欧美亚日韩国产aⅴ精品中极品| 一本大道综合伊人精品热热| 91香蕉视频黄| 欧美三级资源在线| 欧美区在线观看| 欧美一区欧美二区| 精品成人a区在线观看| 久久久国产精品麻豆| 欧美激情综合在线| 亚洲欧美日本在线| 亚洲精品成人在线| 天堂蜜桃91精品| 免费观看一级欧美片| 韩国精品一区二区| 成人av在线播放网站| 日本高清不卡在线观看| 欧美另类久久久品| 26uuu色噜噜精品一区| 国产欧美视频在线观看| 国产精品毛片a∨一区二区三区| 成人免费视频在线观看| 亚洲大型综合色站| 久久疯狂做爰流白浆xx| 成人av一区二区三区| 精品婷婷伊人一区三区三| 欧美成人精品高清在线播放| 国产喷白浆一区二区三区| 亚洲男人的天堂一区二区 | 亚洲日本欧美天堂| 亚洲一二三区不卡| 久久国产乱子精品免费女| 国内精品在线播放| 99这里只有久久精品视频| 欧美日韩一区精品| 国产亚洲成年网址在线观看| 亚洲人成小说网站色在线| 视频一区二区不卡| 成人av在线网站| 这里只有精品视频在线观看| 国产欧美一区二区精品忘忧草| 亚洲主播在线观看| 国产剧情一区二区| av午夜一区麻豆| 欧美喷水一区二区| 国产欧美一区二区三区在线看蜜臀 | 有坂深雪av一区二区精品| 丝袜美腿一区二区三区| 春色校园综合激情亚洲| 56国语精品自产拍在线观看| 欧美国产精品中文字幕| 亚洲成a人片在线不卡一二三区 | 激情五月激情综合网| 91久久线看在观草草青青| 久久影院视频免费| eeuss国产一区二区三区| 欧美日韩视频在线第一区| 国产精品蜜臀av| 久久精品国产久精国产爱| 在线一区二区观看| 久久这里都是精品| 亚洲一区二区三区四区不卡| 成人午夜伦理影院| 制服丝袜在线91| 一区二区三区四区中文字幕| 激情久久五月天| 欧美亚洲综合色| 国产精品传媒在线| 国产精品自产自拍| 欧美一级黄色大片| 亚洲国产毛片aaaaa无费看| 成熟亚洲日本毛茸茸凸凹| 日韩一级二级三级精品视频| 亚洲一区二区3| 色欧美日韩亚洲| 国产精品久久久久久久久久免费看 | 成人av网站免费观看| 精品国产一区二区三区av性色| 亚洲成av人片在www色猫咪| 91一区二区三区在线观看| 国产亚洲自拍一区| 精品系列免费在线观看| 欧美xxxxxxxxx| 美腿丝袜一区二区三区| 51精品国自产在线| 偷拍亚洲欧洲综合| 欧美高清视频一二三区 | 99视频国产精品| 国产午夜一区二区三区| 国产精品影视天天线| 久久久精品日韩欧美| 国产一区在线视频| 久久综合久久久久88| 久88久久88久久久| 久久综合中文字幕| 国产激情一区二区三区四区 | 亚洲国产综合视频在线观看| 一本一道波多野结衣一区二区| 国产精品成人一区二区艾草| 成人一级黄色片| 18成人在线观看| 在线观看免费亚洲| 午夜久久久久久电影| 欧美精品1区2区3区| 久久99国产精品麻豆| 久久久久久久久久久99999| 国产91精品一区二区麻豆亚洲| 国产视频一区二区在线观看| 成人午夜碰碰视频| 亚洲免费电影在线| 欧美日本在线视频| 91视频91自| 午夜精彩视频在线观看不卡| 日韩三级精品电影久久久| 激情都市一区二区| 国产欧美精品国产国产专区| 91在线视频播放地址| 一区二区三区在线免费| 欧美精品tushy高清| 国产一区二区在线观看免费| 欧美国产精品专区| 欧美色视频在线观看| 麻豆精品一二三| 国产精品色哟哟网站| 欧美视频一区二| 国产在线不卡一区| 亚洲色图清纯唯美| 日韩一区二区三区四区五区六区| 国产精品一区二区不卡| 亚洲黄色av一区| 欧美一区二区不卡视频| 成人免费视频国产在线观看| 亚洲综合另类小说| 久久久久久毛片| 91传媒视频在线播放| 韩国在线一区二区| 一区二区三区在线高清| 精品国产一区二区三区忘忧草| 99re成人在线| 久久超级碰视频| 尤物av一区二区| 久久亚洲精精品中文字幕早川悠里 | 91精品婷婷国产综合久久性色 | 欧美一区二区三区男人的天堂| 精品一区二区三区免费观看| 亚洲乱码日产精品bd| 日韩免费一区二区| 91麻豆精品在线观看| 国内外成人在线视频| 亚洲综合色婷婷| 欧美国产日韩一二三区| 日韩欧美国产一区二区在线播放| www.成人在线| 久热成人在线视频| 亚洲一区二区四区蜜桃| 中文字幕第一区| 欧美xxxxx裸体时装秀| 欧美日韩国产首页在线观看| av一区二区三区在线|