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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tscomm.pas

?? 一個比較好的串口控件(delphi 7.0)
?? PAS
?? 第 1 頁 / 共 2 頁
字號:

//這是一個串行控件的加強(qiáng)版,它繼承于SpCom.

// Author: 周益波 中國大陸
// Email:  zhouyibo2000@sina.com
// StartDate: 2001/9/14

// version 1.00: 2001/9/19
//               - 用戶收發(fā)數(shù)據(jù)更加方便,發(fā)送和接收數(shù)據(jù)都存在隊列中,方便操作.
//               - 簡化了對錯誤的處理過程,錯誤類型采用集中式管理.
//               - 自定義錯誤類型,可以是無限多個錯誤.
//               - 每個錯誤都有自己的重發(fā)次數(shù)和延遲時間.
//               - 錯誤次數(shù)可以是獨立計數(shù),也可以是混合計數(shù).

unit TSComm;

interface

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

    {以下為接收數(shù)據(jù)的檢查結(jié)果消息}
{const TSCOM_USER                    = WM_USER + $100;       //用戶自定義消息
      TSCOM_ALLRIGHT                = TSCOM_USER + $1;      //完全正確
      TSCOM_TOPOVERTIMEERROR        = TSCOM_USER + $2;      //上位機(jī)超時錯誤
      TSCOM_TOPFRAMEFORMATERROR     = TSCOM_USER + $3;      //上位機(jī)幀格式錯誤
      TSCOM_TOPCHECKSUMERROR        = TSCOM_USER + $4;      //上位機(jī)校驗和錯誤
      TSCOM_BOTTOMOVERTIMEERROR     = TSCOM_USER + $5;      //下位機(jī)超時錯誤
      TSCOM_BOTTOMFRAMEFORMATERROR  = TSCOM_USER + $6;      //下位機(jī)幀格式錯誤
      TSCOM_BOTTOMCHECKSUMERROR     = TSCOM_USER + $7;      //下位機(jī)校驗和錯誤
      TSCOM_OTHERERROR              = TSCOM_USER + $8;      //其他錯誤
}

const TSCOM_NULL = -2;              //沒收到
      TSCOM_RIGHT = -1;             //收到錯誤

type
    {檢查結(jié)果}
  TTSComm = class;

  TErrorStyle = (esOverTime, esOther);

    {存儲結(jié)構(gòu)的列表}
  TRecordList = class(TList)
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  end;

    {接收數(shù)據(jù)事件}
  TTSReceiveDataEvent = procedure(Sender: TObject; Buffer: PChar; BufferLength: Word; HasSendData: Pointer;
                                  var ADataBuffer: string; var ErrorIndex: Integer) of object;

    {發(fā)送數(shù)據(jù)事件}
  TTSSendDataEvent = procedure(Sender: TObject; SendData: Pointer) of object;

    {接收數(shù)據(jù)錯誤事件}
  TTSReceiveErrorEvent = procedure(Sender: TObject; HasSendData: Pointer; ErrorIndex: Integer) of object;

    {分類錯誤事件}
  TTSSingleReceiveErrorEvent = procedure(Sender: TObject; HasSendData: Pointer; ErrorCount: Integer) of object;

    {錯誤設(shè)置類}
  TCustomErrorOption = class(TCollectionItem)
  private
    FErrorStyle: TErrorStyle;
    FCount: Word;
    FDelay: Longword;
    FTimeIndex: Integer;
    FIndex: Word;
    FSendInfoList: TRecordList;
    FDateTime: TDateTime;
    FText: string;
    FEnabled: Boolean;
    FOnTSSingleReceiveError: TTSSingleReceiveErrorEvent;
    procedure SetCount(const ACount: Word);
    procedure SetDelay(const ADelay: Longword);
    procedure SetErrorIndex(const AIndex: Word);
    procedure SetDateTime(const ADateTime: TDateTime);
    procedure SetText(const AText: string);
    procedure SetErrorStyle(const AErrorStyle: TErrorStyle);
    procedure SetEnabled(const AEnabled: Boolean);
    procedure SetTimeIndex(const Value: Integer);
  protected
    function GetDisplayName: string; override;
    property Index: Word read FIndex write SetErrorIndex;
    property DateTime: TDateTime read FDateTime write SetDateTime;
  public
    constructor Create(Collection: TCollection); override;
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
    function AddSendInfoValue(Value: Pointer): Integer;
    property TimeIndex: Integer read FTimeIndex Write SetTimeIndex;
    property SendInfoList: TRecordList read FSendInfoList;
  published
    property Count: Word read FCount write SetCount;
    property Delay: Longword read FDelay write SetDelay;
    property Text: string read FText write SetText;
    property Enabled: Boolean read FEnabled write SetEnabled;
    property ErrorStyle: TErrorStyle read FErrorStyle write SetErrorStyle;
    property OnTSSingleReceiveError: TTSSingleReceiveErrorEvent
      read FOnTSSingleReceiveError write FOnTSSingleReceiveError;
  end;

  TErrorOptions = class(TCollection)
  private
    FTSComm: TTSComm;
    FCurrentErrorOption: TCustomErrorOption; //當(dāng)前錯誤
    FOverTimeErrorOption: TCustomErrorOption;//超時錯誤
    function GetItem(Index: Integer): TCustomErrorOption;
    procedure SetItem(Index: Integer; Value: TCustomErrorOption);
    procedure SetOverTimeErrorOption(const Value: TCustomErrorOption);
    procedure SetCurrentErrorOption(const Value: TCustomErrorOption);
  protected
    function GetOwner: TPersistent; override;
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(TSComm: TTSComm);
    function Add: TCustomErrorOption;
    property Items[Index: Integer]: TCustomErrorOption read GetItem write SetItem; default;
    property CurrentErrorOption: TCustomErrorOption read FCurrentErrorOption write SetCurrentErrorOption;
    property OverTimeErrorOption: TCustomErrorOption read FOverTimeErrorOption write SetOverTimeErrorOption stored True;
  end;

  TGeneralOption = class(TPersistent)
  private
    FTSComm: TTSComm;
    FIsSingleCountError: Boolean;  //錯誤次數(shù)是否獨立
    FIsSingleIndexError: Boolean;  //錯誤當(dāng)前次數(shù)是否獨立
    FIsSingleDelayError: Boolean;  //錯誤延遲時間是否獨立
    FIsCumulateError: Boolean;     //錯誤是否累積
    FErrorCount: Word;             //錯誤總次數(shù)
    FErrorDelay: Cardinal;         //錯誤延遲時間
    FErrorIndex: Word;             //錯誤次數(shù)
    FSucceedDelay: Cardinal;       //接收數(shù)據(jù)成功后延遲
    FSucceedDelayIndex: Cardinal;  //接收數(shù)據(jù)成功后當(dāng)前延遲
    FSucceedCount: Word;           //成功次數(shù)
    FSucceedCountIndex: Word;      //成功當(dāng)前次數(shù)
    procedure SetErrorCount(const Value: Word);
    procedure SetErrorDelay(const Value: Cardinal);
    procedure SetIsCumulateError(const Value: Boolean);
    procedure SetIsSingleCountError(const Value: Boolean);
    procedure SetIsSingleDelayError(const Value: Boolean);
    procedure SetIsSingleIndexError(const Value: Boolean);
    procedure SetSucceedCount(const Value: Word);
    procedure SetSucceedDelay(const Value: Cardinal);
  protected
    procedure AssignTo(Dest: TPersistent); override;
  public
    constructor Create(TSComm: TTSComm); virtual;
  published
    property IsSingleCountError: Boolean read FIsSingleCountError write SetIsSingleCountError;
    property IsSingleDelayError: Boolean read FIsSingleDelayError write SetIsSingleDelayError;
    property IsSingleIndexError: Boolean read FIsSingleIndexError write SetIsSingleIndexError;
    property IsCumulateError: Boolean read FIsCumulateError write SetIsCumulateError;
    property ErrorCount: Word read FErrorCount write SetErrorCount;
    property ErrorDelay: Cardinal read FErrorDelay write SetErrorDelay;
    property SucceedDelay: Cardinal read FSucceedDelay write SetSucceedDelay;
    property SucceedCount: Word read FSucceedCount write SetSucceedCount;
  end;

    {串行通訊加強(qiáng)類}
  TTSComm = class(TComm)
  private
    FErrorOptions: TErrorOptions;
    FGeneralOption: TGeneralOption;
///////////////////////////////////////////////////////////////////////////////////////

    FSendList: TRecordList;           //發(fā)送數(shù)據(jù)列表
    FReceiveList: TRecordList;        //接收數(shù)據(jù)列表
    FSendRecord: Pointer;             //發(fā)送的數(shù)據(jù)

    FDataBuffer: string;              //經(jīng)過自定義檢查后的數(shù)據(jù)

    FTimeID: Longint;                 //多媒體定時器的返回值

    FHasSend: Boolean;                //數(shù)據(jù)是否已經(jīng)發(fā)送
    FHasReceive: Boolean;             //數(shù)據(jù)是否已經(jīng)接收

    {接受數(shù)據(jù)事件,在這里可以檢測接收的數(shù)據(jù)的格式是否符合通訊協(xié)議}
    FOnTSReceiveData: TTSReceiveDataEvent;
    {發(fā)送數(shù)據(jù)事件,在這里可以編寫怎樣發(fā)送數(shù)據(jù)}
    FOnTSSendData: TTSSendDataEvent;
    {接收數(shù)據(jù)錯誤事件,在這里可以編寫錯誤處理事件}
    FOnTSReceiveError: TTSReceiveErrorEvent;

    procedure SetDataBuffer(Value: string);
      {定時事件}
    procedure TimeProcedure;
    procedure SetErrorOption(ACustomErrorOption: TCustomErrorOption);
    procedure ClearErrorOptionIndex;
    procedure ClearErrorOptionTimeIndex;
    procedure SetGeneralOption(const Value: TGeneralOption);
  protected
    function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
    procedure ReceiveData(Buffer: PChar; BufferLength: Word); override;
    procedure SetErrorOptions(Value: TErrorOptions);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
      {發(fā)送本列表頭數(shù)據(jù)}
    function SendAgain: boolean;
      {發(fā)送下一項數(shù)據(jù)}
    function SendNext: boolean;
      {把發(fā)送數(shù)據(jù)添加進(jìn)列表}
    function AddToSendList(AItem: Pointer): Integer;
      {把接收數(shù)據(jù)添加進(jìn)列表}
    function AddToReceiveList(AItem: Pointer): Integer;
    procedure DeleteReceiveList(Index: Integer);

    property DataBuffer: string read FDataBuffer write SetDataBuffer;
    property SendList: TRecordList read FSendList write FSendList;
    property ReceiveList: TRecordList read FReceiveList write FReceiveList;
    property SendRecord: pointer read FSendRecord;

  published
    property ErrorOptions: TErrorOptions read FErrorOptions write SetErrorOptions;
    property GeneralOption: TGeneralOption read FGeneralOption write SetGeneralOption;

    property OnTSReceiveData: TTSReceiveDataEvent
      read FOnTSReceiveData write FOnTSReceiveData;
    property OnTSSendData: TTSSendDataEvent
      read FOnTSSendData write FOnTSSendData;
    property OnTSReceiveError: TTSReceiveErrorEvent
      read FOnTSReceiveError write FOnTSReceiveError;

  end;

  {回調(diào)函數(shù),多謀體定時器}
procedure TimeProc(uID, uMsg, dwUser, dw1, dw2: Longint) stdcall;

var TSComm1: TTSComm;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Custom', [TTSComm]);
end;

{ TTSComm }

function TTSComm.Perform(Msg: Cardinal; WParam, LParam: Integer): Longint;
var
  Message: TMessage;
begin
  Message.Msg := Msg;
  Message.WParam := WParam;
  Message.LParam := LParam;
  Message.Result := 0;
  if Self <> nil then Dispatch(Message);
  Result := Message.Result;
end;

procedure TimeProc(uID, uMsg, dwUser, dw1, dw2: Longint) stdcall;
begin
  TSComm1.TimeProcedure;
end;

procedure TTSComm.TimeProcedure;
begin
  if FErrorOptions.CurrentErrorOption <> nil then
  begin
    FErrorOptions.CurrentErrorOption.TimeIndex := FErrorOptions.CurrentErrorOption.TimeIndex + 1;
    if FErrorOptions.CurrentErrorOption.TimeIndex > FErrorOptions.CurrentErrorOption.Delay then
    begin
      FErrorOptions.CurrentErrorOption.TimeIndex := 0;
      FErrorOptions.CurrentErrorOption := FErrorOptions.OverTimeErrorOption;
      SetErrorOption(FErrorOptions.CurrentErrorOption);
    end;
  end;
end;

procedure TTSComm.ReceiveData(Buffer: PChar; BufferLength: Word);
var ErrorIndex: Integer;
begin
  inherited ReceiveData(Buffer, BufferLength);
  if Assigned(FOnTSReceiveData) then
  begin
    ErrorIndex := TSCOM_NULL;
    FDataBuffer := '';
    FOnTSReceiveData(self, Buffer, BufferLength, FSendRecord, FDataBuffer, ErrorIndex);
    if (ErrorIndex >= 0) and (FErrorOptions[ErrorIndex].Enabled) then
    begin
      if FHasSend then
      begin
        FErrorOptions.CurrentErrorOption := FErrorOptions[ErrorIndex];
        SetErrorOption(FErrorOptions.CurrentErrorOption);
      end;
      FHasSend := False;
    end else if ErrorIndex = TSCOM_RIGHT then
    begin
      FErrorOptions.CurrentErrorOption.TimeIndex :=
        FErrorOptions.CurrentErrorOption.FDelay - FGeneralOption.FSucceedDelay;
      FHasReceive := True;
    end;
  end;
end;

procedure TTSComm.SetErrorOption(ACustomErrorOption: TCustomErrorOption);

  procedure SetErrorEvent(var AErrorIndex: Word; AErrorCount: Word);
  begin
    Inc(AErrorIndex);
    if Assigned(ACustomErrorOption.FOnTSSingleReceiveError) then
      ACustomErrorOption.FOnTSSingleReceiveError(ACustomErrorOption,
        FSendRecord, AErrorIndex);
    begin
      if AErrorIndex > AErrorCount then
      begin
        AErrorIndex := 0;
        if Assigned(FOnTSReceiveError) then
          FOnTSReceiveError(Self, FSendRecord, ACustomErrorOption.ID);
        if ACustomErrorOption.ErrorStyle = esOverTime then
          FHasSend := SendNext;
      end else
      begin
        if ACustomErrorOption.ErrorStyle = esOverTime then
          FHasSend := SendAgain;
      end;
    end;
  end;

  procedure SetSendData(var AErrorIndex: Word; AErrorCount: Word);
  begin
  end;

begin
  if not FHasReceive then     //如果沒有收到
  begin
    if FHasSend then          //如果已經(jīng)發(fā)送
    begin
      if FGeneralOption.IsSingleCountError then
      begin
        if FGeneralOption.IsSingleIndexError then
          SetErrorEvent(FGeneralOption.FErrorIndex, ACustomErrorOption.Count)
        else
          SetErrorEvent(ACustomErrorOption.FIndex, ACustomErrorOption.Count);
      end else
      begin
        SetErrorEvent(FGeneralOption.FErrorIndex, FGeneralOption.ErrorCount);
      end;
    end else                  //沒有發(fā)送
    begin
      FHasSend := SendAgain;
    end;
  end else FHasSend := SendNext;
  FHasReceive := False;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久毛片高清国产| 美女网站视频久久| 久久国产精品无码网站| av在线这里只有精品| 日韩午夜激情视频| 天天操天天色综合| 91国偷自产一区二区三区成为亚洲经典 | 亚洲成人av在线电影| 国产91精品一区二区| 欧美一卡二卡三卡四卡| 一区二区三区免费网站| 国产91精品一区二区麻豆网站| 制服丝袜中文字幕一区| 亚洲精品免费一二三区| 色播五月激情综合网| 中文字幕在线视频一区| 国产一区不卡在线| 欧美成人官网二区| 蜜桃精品视频在线| 欧美一级夜夜爽| 日韩电影免费在线看| 欧美日韩不卡在线| 亚洲五月六月丁香激情| 欧美性受xxxx黑人xyx性爽| 亚洲色图制服诱惑| 色丁香久综合在线久综合在线观看| 日本一区二区综合亚洲| 国产美女精品一区二区三区| 久久久综合网站| 国产激情精品久久久第一区二区| 久久久久久99精品| 成人午夜免费电影| 国产精品久久久久久妇女6080| 国产99久久久国产精品潘金| 国产欧美久久久精品影院| 国产69精品久久久久777| 欧美国产精品v| www.视频一区| 亚洲一区视频在线| 日韩一区二区在线免费观看| 狠狠色综合日日| 中文字幕 久热精品 视频在线 | 97aⅴ精品视频一二三区| 亚洲欧洲一区二区在线播放| 一本一道综合狠狠老| 亚洲最色的网站| 欧美精品在线观看播放| 国内偷窥港台综合视频在线播放| 国产农村妇女毛片精品久久麻豆 | 国模娜娜一区二区三区| 久久精子c满五个校花| 国产91精品精华液一区二区三区| 综合久久综合久久| 91精品国产综合久久香蕉的特点| 精品亚洲国内自在自线福利| 亚洲国产成人一区二区三区| 在线观看av一区二区| 免费欧美在线视频| 久久久久久一二三区| 色综合久久久久久久久久久| 亚洲18色成人| 日韩精品一区二区三区视频在线观看| 韩国女主播一区| 一个色在线综合| 欧美不卡123| 国产伦精品一区二区三区免费| 亚洲图片你懂的| 日韩欧美国产一区在线观看| 成人污视频在线观看| 亚洲va韩国va欧美va精品| www久久精品| 91行情网站电视在线观看高清版| 精品一区二区在线观看| 一区二区不卡在线播放 | 久久国产免费看| 亚洲天堂av老司机| 欧美一级免费观看| 91丝袜美腿高跟国产极品老师| 美女高潮久久久| 老司机精品视频在线| 国产精品免费aⅴ片在线观看| 欧洲一区在线电影| 成人国产在线观看| 美女视频黄频大全不卡视频在线播放| 中文字幕永久在线不卡| 精品国产三级a在线观看| 91福利在线观看| 国产一区二区精品在线观看| 亚洲午夜久久久久久久久电影网| 国产欧美1区2区3区| 日韩欧美在线网站| 678五月天丁香亚洲综合网| 99精品在线观看视频| 成人免费高清在线| 国产精品一区不卡| 国产综合色在线视频区| 蜜桃视频一区二区| 日韩av不卡一区二区| 五月婷婷综合网| 亚洲一区二区三区中文字幕 | 成人午夜av电影| 国产一区二区精品在线观看| 免费在线观看一区二区三区| 亚洲成av人影院在线观看网| 亚洲免费av观看| 国产精品亲子乱子伦xxxx裸| 久久影院视频免费| 2014亚洲片线观看视频免费| 欧美大片一区二区| 精品久久一区二区| 精品av综合导航| 国产亚洲精品bt天堂精选| 7777精品伊人久久久大香线蕉| 欧美午夜一区二区| 欧美日韩免费观看一区二区三区| 91久久精品一区二区三区| 国产成人精品一区二| 国产91精品入口| 91免费视频观看| 欧美日韩国产精品成人| 91精品一区二区三区在线观看| 欧美一级xxx| 26uuu精品一区二区| 国产精品久久三| 亚洲综合色婷婷| 奇米色一区二区三区四区| 九色|91porny| www.色精品| 欧美日韩一卡二卡三卡 | 欧美精品一二三| 日韩欧美国产一区二区三区| 精品国产伦理网| 中文字幕欧美一| 三级欧美在线一区| 国产专区综合网| 一本色道久久加勒比精品| 56国语精品自产拍在线观看| 日韩欧美电影一区| 国产精品嫩草99a| 中文字幕一区二区三区在线播放| 亚洲一区二区三区四区在线免费观看| 丝袜美腿高跟呻吟高潮一区| 久久成人免费日本黄色| 成人涩涩免费视频| 欧美午夜在线观看| 久久嫩草精品久久久精品一| 一区二区三区中文免费| 日韩精品免费专区| 国产精品自拍网站| 欧洲在线/亚洲| 日韩你懂的在线观看| 中文字幕免费一区| 日韩av网站在线观看| 成人午夜碰碰视频| 日韩一区二区免费视频| 日韩伦理电影网| 国产精品影视网| 777午夜精品视频在线播放| 亚洲国产电影在线观看| 青青青爽久久午夜综合久久午夜| 欧美三级午夜理伦三级中视频| 久久蜜桃香蕉精品一区二区三区| 一区二区三区在线免费视频| 国产一区二区h| 欧美三级中文字| 亚洲日韩欧美一区二区在线| 久久99精品久久只有精品| 欧美主播一区二区三区美女| 中文字幕的久久| 精品一区二区免费在线观看| 欧美日韩一区二区三区不卡| 欧美激情一区二区在线| 久久99精品久久久久婷婷| 欧美日韩视频不卡| 亚洲精品视频在线| 91丨porny丨国产| 日本一区二区免费在线| 韩国v欧美v亚洲v日本v| 欧美丰满少妇xxxxx高潮对白| 亚洲精品福利视频网站| 99久免费精品视频在线观看| 久久这里只有精品视频网| 天天影视涩香欲综合网| 欧美日韩一级视频| 一区二区三区在线免费| 91视频精品在这里| 综合在线观看色| av不卡免费电影| 国产欧美一区二区精品性色超碰| 日本少妇一区二区| 51精品久久久久久久蜜臀| 亚洲一二三四久久| 一本久道久久综合中文字幕| 久久久亚洲国产美女国产盗摄 | 日韩午夜av一区| 日日夜夜免费精品| 欧美一级高清片| 美女一区二区久久| 亚洲精品一区二区三区四区高清| 青青青爽久久午夜综合久久午夜|