亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲chinese男男1069| 一区二区三区在线免费观看 | 国产suv精品一区二区三区| 337p亚洲精品色噜噜狠狠| 亚欧色一区w666天堂| 欧美精品一级二级三级| 全部av―极品视觉盛宴亚洲| 日韩精品一区二| 国产精品系列在线播放| 中文字幕中文在线不卡住| 91久久国产最好的精华液| 午夜av一区二区三区| 欧美xfplay| 成人免费毛片嘿嘿连载视频| 亚洲精品老司机| 69av一区二区三区| 国产一区二区按摩在线观看| 亚洲男人的天堂在线aⅴ视频| 亚洲午夜国产一区99re久久| 美国十次综合导航| 成人美女视频在线观看| 欧美日韩午夜在线| 欧美一级理论性理论a| 欧美国产精品久久| 蜜桃在线一区二区三区| 色婷婷精品久久二区二区蜜臂av| 欧美一区二区视频观看视频| 一区二区三区欧美久久| 色综合色综合色综合| 午夜激情久久久| 国产区在线观看成人精品 | 亚洲成av人在线观看| 日韩无一区二区| 91在线小视频| 麻豆成人免费电影| 亚洲女同女同女同女同女同69| 91精品视频网| 91蜜桃网址入口| 精品在线一区二区三区| 亚洲国产日韩一区二区| 国产精品亲子伦对白| 欧美一级二级三级蜜桃| 在线观看视频91| 成人免费电影视频| 狠狠色丁香婷综合久久| 亚洲成av人片在线| 亚洲视频在线一区二区| 久久久午夜电影| 日韩一区二区三区观看| 欧美性猛交xxxx乱大交退制版| 国产老妇另类xxxxx| 男女激情视频一区| 亚洲国产精品综合小说图片区| 欧美国产一区二区在线观看| 亚洲精品一线二线三线无人区| 在线观看亚洲一区| 成人国产精品免费网站| 国产精品一品视频| 精品亚洲国内自在自线福利| 香蕉久久夜色精品国产使用方法 | 56国语精品自产拍在线观看| 日韩精品中午字幕| 不卡视频在线观看| 久久精品国产99国产| 久久久噜噜噜久久中文字幕色伊伊 | 日韩va欧美va亚洲va久久| 91精品中文字幕一区二区三区| 日韩av一区二| 亚洲国产高清在线观看视频| 亚洲国产成人午夜在线一区| 免费看日韩精品| 亚洲精品你懂的| 亚洲色图欧美激情| 亚洲天堂av一区| 欧美国产综合一区二区| 中文字幕欧美日韩一区| 亚洲国产精品成人久久综合一区 | 欧洲一区二区三区免费视频| 成人午夜激情片| 成人综合在线网站| a级高清视频欧美日韩| 成人深夜福利app| 国产宾馆实践打屁股91| 风流少妇一区二区| 成人激情免费网站| 99国产精品国产精品久久| 99亚偷拍自图区亚洲| 99久久国产综合精品色伊| 91丨国产丨九色丨pron| 日本久久一区二区| 欧美人与z0zoxxxx视频| 欧美一区二区三区在线电影| 日韩欧美精品在线视频| 久久免费偷拍视频| 中文字幕在线一区免费| 亚洲一区二区影院| 免费高清在线视频一区·| 国产麻豆精品在线| 成人av网在线| 在线观看国产91| 91精品国产美女浴室洗澡无遮挡| 精品裸体舞一区二区三区| 亚洲国产成人自拍| 亚洲图片有声小说| 久久99深爱久久99精品| 成人深夜福利app| 在线观看免费成人| 国产激情一区二区三区四区| 91视频精品在这里| 中文字幕二三区不卡| 国产女同性恋一区二区| 国产精品家庭影院| 亚洲福利一区二区| 国产精一品亚洲二区在线视频| 久久99热这里只有精品| 粉嫩一区二区三区在线看| 99久久99久久免费精品蜜臀| 在线观看区一区二| 日本一区二区三级电影在线观看| 欧美成人国产一区二区| 久久久久国产精品厨房| 亚洲精品伦理在线| 国产麻豆一精品一av一免费| 91高清视频免费看| 久久综合色鬼综合色| 亚洲狠狠丁香婷婷综合久久久| 日本不卡在线视频| 91原创在线视频| 欧美精品一区二区蜜臀亚洲| 亚洲卡通动漫在线| 国产成人亚洲综合a∨婷婷 | 成人欧美一区二区三区小说 | 亚洲一区视频在线| 国产精品综合一区二区| 欧美日本在线播放| 国产精品欧美经典| 精品一区二区在线免费观看| 欧美日韩一区精品| 日韩一区在线免费观看| 国产精品18久久久久久久网站| 欧美久久一二区| 亚洲精品久久久蜜桃| 成人免费毛片a| 久久天天做天天爱综合色| 日韩精品免费视频人成| 色婷婷亚洲综合| 国产精品久99| 丰满少妇在线播放bd日韩电影| 欧美大片免费久久精品三p| 亚洲成人av电影| 91蜜桃在线免费视频| 国产精品久久久久久久久搜平片| 国产一区视频导航| 欧美电影免费观看高清完整版| 亚洲成在人线免费| 欧美在线免费观看亚洲| 亚洲靠逼com| 91老师国产黑色丝袜在线| 国产精品乱码妇女bbbb| 成人免费av在线| 欧美国产一区二区在线观看| 国产成人av一区二区三区在线| 日韩国产欧美在线观看| 4hu四虎永久在线影院成人| 色偷偷久久人人79超碰人人澡| 国产精品自拍一区| 中文字幕一区视频| 欧美日韩精品一区二区三区| 精品一区二区三区在线播放| 国产欧美一区二区精品性色| 91首页免费视频| 免费av成人在线| 中文字幕亚洲精品在线观看| 欧美高清视频不卡网| 国产成人精品免费看| 亚洲国产成人高清精品| 国产精品国产三级国产普通话99| 国产一区在线精品| 久久精子c满五个校花| 成人午夜伦理影院| 中文字幕一区av| 色婷婷狠狠综合| 一区二区三区国产精华| 欧美日韩国产高清一区二区| 午夜国产不卡在线观看视频| 欧美一卡2卡3卡4卡| 国产自产视频一区二区三区| 中文幕一区二区三区久久蜜桃| 99热精品一区二区| 亚洲成在人线在线播放| 日韩精品在线一区| 粉嫩欧美一区二区三区高清影视 | 精品国产免费视频| 国产成人精品免费网站| 伊人开心综合网| 在线不卡一区二区| 国内一区二区视频| 中文字幕亚洲视频| 91麻豆精品国产自产在线| 国产老肥熟一区二区三区|