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

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

?? tscomm.pas

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

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

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

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

unit TSComm;

interface

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

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

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

type
    {檢查結果}
  TTSComm = class;

  TErrorStyle = (esOverTime, esOther);

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

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

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

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

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

    {錯誤設置類}
  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; //當前錯誤
    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;  //錯誤次數是否獨立
    FIsSingleIndexError: Boolean;  //錯誤當前次數是否獨立
    FIsSingleDelayError: Boolean;  //錯誤延遲時間是否獨立
    FIsCumulateError: Boolean;     //錯誤是否累積
    FErrorCount: Word;             //錯誤總次數
    FErrorDelay: Cardinal;         //錯誤延遲時間
    FErrorIndex: Word;             //錯誤次數
    FSucceedDelay: Cardinal;       //接收數據成功后延遲
    FSucceedDelayIndex: Cardinal;  //接收數據成功后當前延遲
    FSucceedCount: Word;           //成功次數
    FSucceedCountIndex: Word;      //成功當前次數
    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;

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

    FSendList: TRecordList;           //發送數據列表
    FReceiveList: TRecordList;        //接收數據列表
    FSendRecord: Pointer;             //發送的數據

    FDataBuffer: string;              //經過自定義檢查后的數據

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

    FHasSend: Boolean;                //數據是否已經發送
    FHasReceive: Boolean;             //數據是否已經接收

    {接受數據事件,在這里可以檢測接收的數據的格式是否符合通訊協議}
    FOnTSReceiveData: TTSReceiveDataEvent;
    {發送數據事件,在這里可以編寫怎樣發送數據}
    FOnTSSendData: TTSSendDataEvent;
    {接收數據錯誤事件,在這里可以編寫錯誤處理事件}
    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;
      {發送本列表頭數據}
    function SendAgain: boolean;
      {發送下一項數據}
    function SendNext: boolean;
      {把發送數據添加進列表}
    function AddToSendList(AItem: Pointer): Integer;
      {把接收數據添加進列表}
    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;

  {回調函數,多謀體定時器}
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          //如果已經發送
    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                  //沒有發送
    begin
      FHasSend := SendAgain;
    end;
  end else FHasSend := SendNext;
  FHasReceive := False;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩中文久久| 欧美老年两性高潮| 久久99热这里只有精品| 丝袜美腿高跟呻吟高潮一区| 亚洲成人动漫av| 亚洲黄色av一区| 国产精品美女视频| 中文字幕制服丝袜一区二区三区 | 亚洲第一激情av| 亚洲免费三区一区二区| 亚洲在线观看免费视频| 全国精品久久少妇| 国产麻豆成人精品| 大美女一区二区三区| 色婷婷av一区| 欧美精品三级在线观看| www久久精品| 一区在线中文字幕| 丝袜美腿亚洲一区二区图片| 韩国成人精品a∨在线观看| 在线观看精品一区| 91高清视频在线| 国产精品免费观看视频| 欧美国产精品一区二区三区| 精品捆绑美女sm三区| 国产视频一区二区在线观看| 综合激情网...| 男女男精品视频网| 91在线视频观看| 精品国产乱码久久久久久久久| 日韩午夜av一区| 亚洲一区二区三区四区在线| 制服丝袜激情欧洲亚洲| 国产精品传媒入口麻豆| 五月激情六月综合| jvid福利写真一区二区三区| 日韩一区二区视频在线观看| 一区二区三区日韩精品| 国产精品久久久久久一区二区三区 | 亚洲va欧美va天堂v国产综合| 亚洲一二三四在线观看| 国产麻豆视频精品| 日韩女优av电影在线观看| 亚洲精品综合在线| 99re这里只有精品6| xnxx国产精品| 久久精品理论片| 久久久国产午夜精品| 亚州成人在线电影| 欧美日韩国产小视频在线观看| 国产欧美精品国产国产专区| 久久国产福利国产秒拍| 91精品久久久久久久久99蜜臂| 中文字幕视频一区| 成人小视频在线| 中文字幕一区二区日韩精品绯色 | 中文字幕第一区综合| 91小视频在线| 中文欧美字幕免费| av综合在线播放| 日韩免费电影一区| 亚洲影视在线观看| 国产丶欧美丶日本不卡视频| 久久久久久久久久久久电影| 在线综合+亚洲+欧美中文字幕| 欧美日韩激情一区二区三区| 欧美日韩久久久| 亚洲精品日产精品乱码不卡| 99在线视频精品| 综合久久久久久久| 成人爱爱电影网址| 国产精品国产三级国产a| 国产成人在线视频免费播放| 精品福利一区二区三区| 亚洲欧美日本韩国| 一本到一区二区三区| 亚洲一区二区三区在线播放| 欧美一级日韩不卡播放免费| 国产一区二区按摩在线观看| 国产人妖乱国产精品人妖| 在线观看国产91| 九九九精品视频| ㊣最新国产の精品bt伙计久久| 色综合天天综合网天天看片| 性久久久久久久久| 亚洲国产精品成人综合| 欧美午夜精品一区| 久久精品国产澳门| 一区二区在线观看不卡| 日韩精品一区二区三区三区免费| heyzo一本久久综合| 亚洲成在线观看| 久久精品免视看| 91精品国产综合久久精品app| 国产在线看一区| 亚洲国产成人av好男人在线观看| 日韩精品一区二区三区三区免费| 97精品国产露脸对白| 久久99热99| 久久99最新地址| 亚洲裸体xxx| 亚洲电影一级黄| 国产精品不卡在线观看| 欧美日韩一级片网站| 色狠狠色狠狠综合| 中文字幕av一区二区三区免费看 | 久久久综合视频| 成人国产精品免费网站| 夜夜精品浪潮av一区二区三区 | 日本亚洲视频在线| 国产日产欧美一区| 91亚洲精品一区二区乱码| 7777精品伊人久久久大香线蕉超级流畅 | 一区二区三区在线免费播放| 国产亚洲美州欧州综合国| 欧美一级理论性理论a| 欧美亚洲自拍偷拍| 欧美日韩免费在线视频| 在线国产电影不卡| 欧美三级乱人伦电影| 国产资源在线一区| 精品一区二区三区蜜桃| 久久99精品久久久| 黑人巨大精品欧美一区| 成人午夜伦理影院| 99久久亚洲一区二区三区青草| 国产91精品精华液一区二区三区| 成人三级伦理片| 91免费视频网| 欧美久久高跟鞋激| 欧美第一区第二区| 国产亚洲成aⅴ人片在线观看| 国产精品―色哟哟| 亚洲一区二区视频在线观看| 日韩和欧美一区二区| 老鸭窝一区二区久久精品| 国产一区二区91| 337p亚洲精品色噜噜狠狠| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产综合一区二区| 欧美日韩一区二区三区免费看 | 免费成人在线观看| 亚洲精品日韩一| 日韩电影免费在线| 国产精一区二区三区| 色综合久久中文字幕综合网| 欧美视频在线一区二区三区| 精品国产一区a| 亚洲永久免费视频| 蜜臀av性久久久久av蜜臀妖精| av电影天堂一区二区在线| 一区二区三区成人在线视频| 日韩欧美中文一区二区| 91精品国产一区二区人妖| 成人app下载| 国产一区不卡在线| 日韩精品亚洲一区二区三区免费| 中文字幕免费不卡| 亚洲精品一区二区三区香蕉| 欧美日韩视频专区在线播放| 成人黄色电影在线| 精品无码三级在线观看视频| 天堂成人国产精品一区| 97国产精品videossex| 久久久夜色精品亚洲| 奇米在线7777在线精品| 欧美日韩美少妇| 亚洲欧美一区二区久久| 粉嫩在线一区二区三区视频| 日韩视频国产视频| 亚洲成人av在线电影| 欧美私人免费视频| 国产精品久久久久天堂| 99久久婷婷国产综合精品电影| 欧美经典一区二区三区| 国产在线日韩欧美| 久久这里只有精品6| 精品系列免费在线观看| 欧美刺激脚交jootjob| 麻豆国产精品视频| 欧美一级二级三级蜜桃| 日日噜噜夜夜狠狠视频欧美人| 97se亚洲国产综合在线| 亚洲免费伊人电影| 欧美老人xxxx18| 日本美女一区二区三区| 日韩免费福利电影在线观看| 国产乱理伦片在线观看夜一区| 亚洲男女一区二区三区| 欧美一级黄色片| 欧美伊人久久大香线蕉综合69| 亚洲亚洲人成综合网络| 欧美丰满一区二区免费视频| 亚洲一区中文日韩| 91精品婷婷国产综合久久性色| 久久99久久久欧美国产| 日韩美女视频一区二区| 成人欧美一区二区三区小说| 一区二区三区视频在线观看| 综合分类小说区另类春色亚洲小说欧美|