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

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

?? port.pas

?? 串口通訊控件。先把 Pcomm.dll 文件拷貝到OS能找得到的目錄下。 在Component菜單下選擇Install Component子菜單
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
{ *********************************************************************** }
{                                                                         }
{                          串口通訊組件                                   }
{                                                                         }
{                          作者 : 韋修毅                                  }
{                          Email: wxy_xp@163.com                          }
{ *********************************************************************** }

unit Port;         

interface
                           
uses
  Windows, Messages, SysUtils,Forms, Classes,PComm,TypInfo;
const
  { error code }
  SIO_OK           = 0;
  SIO_BADPORT      = -1;  { No such port or port not opened }
  SIO_OUTCONTROL   = -2;  { Can't control board }
  SIO_NODATA       = -4;  { No data to read or no buffer to write }
  SIO_OPENFAIL     = -5;   { No such port or port has opened }
  SIO_RTS_BY_HW    = -6;  { Can't set because H/W flowctrl }
  SIO_BADPARM      = -7;  { Bad parameter }
  SIO_WIN32FAIL    = -8;  (* Call win32 function fail, please call }
                             GetLastError to get the error code *)
  SIO_BOARDNOTSUPPORT  = -9;  { Board does not support this function}
  SIO_FAIL         = -10; { PComm function run result fail }
  SIO_ABORT_WRITE  = -11; { Write has blocked, and user abort write }
  SIO_WRITETIMEOUT = -12; { Write timeout has happened }

  BaudRateConst:array[0..19] of integer=(50,75,110,134,150,300,600,
       1200,1800,2400,4800,7200,9600,19200,38400,57600,115200,230400,
       460800,921600);
type
  TBaudRate = (br50,br75,br110, br134,br150,br300, br600, br1200, br1800,
  br2400, br4800,br7200,br9600,br19200, br38400, br57600, br115200,br230400,
  br460800,br921600 );
  TStopBits = (sbOneStopBit,sbTwoStopBits);
  TDataBits = (dbFive, dbSix, dbSeven, dbEight);
  TParityBits = (prNone, prOdd, prEven, prMark, prSpace);
  TFlushBuffer=(FBInput,FBOutput,FBTow);
  TLineStatus=(lsCTS,lsDSR,lsRING,lsRLSD);
  TRxCharEvent = procedure(Sender: TObject; InQue: Integer) of object;
  TPort = class(TComponent)
  private
    FPortOpened:boolean;
    FBaudRate:TBaudRate;
    FPort:string;
    FintPort:integer;
    FParity:TParityBits;
    FStopBits:TStopBits;
    FDataBits:TDataBits;
    FDTR,FRTS,FCTSFlowControl,FDSRFlowControl:Boolean;
    FOnOffOutFlowControl,FOnOffInFlowControl:Boolean;
    FOnRxChar: TRxCharEvent;
    FLastError:integer;
    FSleepTime:Cardinal;
    FUseThread:Boolean;
    F485SleepTime:Cardinal;
    FReadTotalTime:integer;
    FWriteTotalTime:integer;
    //FInternalReadTime: integer;
    FOnConnected: TNotifyEvent;
    Executeing:Boolean;
    function GetMode:Longint;
    procedure SetBaudRate(Value: TBaudRate);
    procedure SetPort(Value: string);
    procedure SetParity(Value: TParityBits);
    procedure SetStopBits(Value: TStopBits);
    procedure SetDataBits(Value: TDataBits);
    procedure SetDTR(Value: Boolean);
    procedure SetRTS(Value: Boolean);

    procedure SetCTSFlowControl(Value: Boolean);
    procedure SetDSRFlowControl(Value: Boolean);
    procedure SetOnOffOutFlowControl(Value: Boolean);
    procedure SetOnOffInFlowControl(Value: Boolean);
    function GetIqueue:integer;
    function GetOqueue:integer;
    function GetErrorMsg:string;
    procedure SetReadTotalTimeouts(Value:integer);
    procedure SetWriteTotalTimeouts(Value:integer);
    procedure SetUseThread(Value:Boolean);
    //procedure SetInternalReadTime(const Value: integer);
    function FindComPort(ComPort:TPort):integer;
    procedure AddComPort(ComPort:TPort);
    procedure DeleteComPort(ComPort:TPort);overload;
    procedure DeleteComPort(Index:integer);overload;
    function InMainThread:Boolean;
  protected
    { Protected declarations }
  public
    ExitWait:Boolean;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function GetBaudRate(BaudRate:integer):TBaudRate;
    function Open:Boolean;
    function Close:Boolean;
    //往端口寫數據,如果返回值>=0,表示實際寫入的數據長度,否則表示出錯。
    function Write(Buffer:PChar; Count: integer): integer; overload;
    function Write(Buffer:array of Char; Count: integer): integer; overload;
    function Write(Buffer:array of Byte; Count: integer): integer; overload;
    function WriteString(Str: string): integer;

    function Write485(Buffer:PChar; Count: integer): integer; overload;
    function Write485(Buffer:array of Char; Count: integer): integer; overload;
    function Write485(Buffer:array of Byte; Count: integer): integer; overload;
    function WriteString485(Str: string): integer;
    //從端口讀數據,如果返回值>=0,表示讀出的數據長度,否則表示出錯。
    function Read(Buffer:PChar; Count: integer): integer;overload;
    function Read(var Buffer:array of Char; Count: integer): integer;overload;
    function Read(var Buffer:array of Byte; Count: integer): integer;overload;
    function ReadString(var Str: string; Count: integer): integer;
    procedure Flush(func:TFlushBuffer);
    {
    func =
    0 :清除輸入緩沖區
    1 :清除輸出緩沖區
    2 :清除輸入/輸出緩沖區
    }
    procedure AbortWrite;
    procedure AbortRead;
    //最后的錯誤代碼
    property LastError:integer read FLastError;
    //目前端口輸入緩沖區中的數據長度
    property Iqueue:integer read GetIqueue;
    //目前端口輸出緩沖區中的數據長度
    property Oqueue:integer read GetOqueue;
    property ErrorMsg:string read GetErrorMsg;
    property Connected:Boolean read FPortOpened;
  published
    //設定讀超時時間
    //-1,立即返回
    //0,等待直到收到指定數目的數據
    //大于0,等待直到收到指定數目的數據或超時
    property ReadTotalTimeouts:integer read FReadTotalTime write SetReadTotalTimeouts default -1;
    //property InternalReadTime:integer read FInternalReadTime write SetInternalReadTime default 0;
    //設定寫超時時間
    //-1,立即返回
    //0,等待直到發出所有數據
    //大于0,等待直到發出所有數據,如果該時間內未發出,則返回
    property WriteTotalTimeouts:integer read FWriteTotalTime write SetWriteTotalTimeouts default 0;
    property OnReceiveData: TRxCharEvent read FOnRxChar write FOnRxChar;
    property BaudRate: TBaudRate read FBaudRate write SetBaudRate;
    property Port: string read FPort write SetPort;
    property Parity: TParityBits read FParity write SetParity;
    property StopBits: TStopBits read FStopBits write SetStopBits;
    property DataBits: TDataBits read FDataBits write SetDataBits;
    property UseThread:Boolean read FUseThread write SetUseThread default True;
    property ThreadSleepTime:Cardinal Read FSleepTime write FSleepTime default 2;
    property SleepTimeOf485:Cardinal read F485SleepTime write F485SleepTime default 20;
    property DTR:Boolean read FDTR write SetDTR default True;
    property RTS:Boolean read FRTS write SetRTS default True;
    property CTSFlowControl:Boolean read FCTSFlowControl write SetCTSFlowControl default False;
    property DSRFlowControl:Boolean read FDSRFlowControl write SetDSRFlowControl default False;
    property OnOffOutFlowControl:Boolean read FOnOffOutFlowControl write SetOnOffOutFlowControl default False;
    property OnOffInFlowControl:Boolean read FOnOffInFlowControl write SetOnOffInFlowControl default False;
    property OnConnected:TNotifyEvent read FOnConnected write FOnConnected;
  end;

procedure Register;
procedure SetMonitorComPortsPerThread(Value:Word);

implementation
                                  
var
  ThreadList:TList;
  ComPortList:TList;
  ThreadCount:integer;
  MonitorComPortsPerThread:Word=15;
  ComPortCritical:TRTLCriticalSection;
  ProcDestroying:Boolean=False;
procedure Register;
begin
  RegisterComponents('AnyLib', [TPort]);
end;

type

  TPortThread = class(TThread)
  private
    Index:integer;
  protected
    procedure Execute; override;
  public
    constructor Create(Index:integer);
    destructor Destroy; override;
  end;

procedure UpdateThreadNumbers;
var
  Count,i:integer;
begin
  if MonitorComPortsPerThread=0 then Exit;
  try
    Count:=ComPortList.Count div MonitorComPortsPerThread;
    if (ComPortList.Count mod MonitorComPortsPerThread)<>0 then
      Inc(Count);
    if Count>ThreadCount then
    begin
      for i:=ThreadCount to Count-1 do
        TPortThread.Create(i);
    end
    else if Count<ThreadCount then
    begin
      for i:=ThreadCount-1 downto Count do
      begin
        TThread(ThreadList.Items[i]).Terminate;
        ThreadList.Delete(i);
      end;
    end;
  except
  end;
end;

procedure SetMonitorComPortsPerThread(Value:Word);
begin
  if Value<=0 then Exit;
  MonitorComPortsPerThread:=Value;
  UpdateThreadNumbers;
end;

{ TPort }

procedure TPort.AbortRead;
begin
  FLastError:=sio_AbortRead(FintPort);
end;

procedure TPort.AbortWrite;
begin
  FLastError:=sio_AbortWrite(FintPort);
end;

function TPort.Close: Boolean;
begin
  if not FPortOpened then
  begin
    Result:=False;
    FLastError:=SIO_BADPORT;
    Exit;
  end;
  sio_flush(FintPort,2);
  FLastError:=sio_close(FintPort);
  Result:=FLastError=SIO_OK;
  if Result then
    FPortOpened:=False;
end;

constructor TPort.Create(AOwner: TComponent);
begin
  inherited;
  Executeing:=False;
  FPort:='COM1';
  FintPort:=1;
  FSleepTime:=2;
  F485SleepTime:=20;
  FUseThread:=True;
  FBaudRate:=br9600;
  FDataBits:=dbEight;
  FParity:=prNone;
  FStopBits:=sbOneStopBit;
  FDTR:=True;
  FRTS:=True;
  FReadTotalTime:=-1;
  FWriteTotalTime:=0;
  //FInternalReadTime:=0;
  FCTSFlowControl:=False;
  FDSRFlowControl:=False;
  FOnOffOutFlowControl:=False;
  FOnOffInFlowControl:=False;
  AddComPort(Self);
end;

destructor TPort.Destroy;
begin
  DeleteComPort(Self);
  if FPortOpened then
    Close;
  inherited;
end;

procedure TPort.Flush(func:TFlushBuffer);
begin
  FLastError:=SIO_BADPORT;
  if not FPortOpened then
    Exit;
  FLastError:=sio_flush(FintPort,Ord(func));
end;

function TPort.GetIqueue: integer;
begin
  Result:=-1;
  FLastError:=SIO_BADPORT;
  if not FPortOpened then
    Exit;
  FLastError:=sio_iqueue(FintPort);
  if FLastError>=0 then
    Result:=FLastError
  else
    Result:=-1;
end;

function TPort.GetMode: Longint;
var
  byteDB,byteSB,bytePR:Byte;
begin
  byteDB:=0;
  byteSB:=0;
  bytePR:=0;
  case FDataBits of
    dbFive:byteDB:=0;
    dbSix:byteDB:=1;
    dbSeven:byteDB:=2;
    dbEight:byteDB:=3;
  end;
  case FStopBits of
    sbOneStopBit:byteSB:=0;
    sbTwoStopBits:byteSB:=4;
  end;
  case FParity of
    prNone:bytePR:=0;
    prOdd:bytePR:=8;
    prEven:bytePR:=$18;
    prMark:bytePR:=$28;
    prSpace:bytePR:=$38;
  end;
  Result:=byteDB or byteSB or bytePR;
end;

function TPort.GetOqueue: integer;
begin
  Result:=-1;
  FLastError:=SIO_BADPORT;
  if not FPortOpened then
    Exit;
  FLastError:=sio_oqueue(FintPort);
  if FLastError>=0 then
    Result:=FLastError
  else
    Result:=-1;
end;

function TPort.Open: Boolean;
begin
  if FPortOpened then
  begin
    Result:=True;
    FLastError:=SIO_OK;
    Exit;
  end;  
  Result:=False;
  FLastError:=sio_open(FintPort);
  if FLastError=SIO_OK then
  begin
    FPortOpened:=True;
    SetBaudRate(FBaudRate);
    SetParity(FParity);
    SetStopBits(FStopBits);
    SetDataBits(FDataBits);
    SetWriteTotalTimeouts(FWriteTotalTime);
    SetReadTotalTimeouts(FReadTotalTime); 
    SetDTR(FDTR);
    SetRTS(FRTS);       
    SetCTSFlowControl(FCTSFlowControl);
    SetDSRFlowControl(FDSRFlowControl);
    SetOnOffOutFlowControl(FOnOffOutFlowControl);
    SetOnOffInFlowControl(FOnOffInFlowControl);
    Result:=True;
    if Assigned(FOnConnected) then
      FOnConnected(Self);
  end;

end;

function TPort.Read(Buffer:PChar; Count: integer): integer;
var
  OldTime:Cardinal;
begin
  FLastError:=SIO_BADPORT;
  Result:=0;
  if not FPortOpened then
    Exit;
  if (FReadTotalTime>=0) then
  begin
    OldTime:=GetTickCount;
    while True do
    begin
      if Iqueue>=Count then Break;
      if FReadTotalTime>0 then
        if Abs(GetTickCount-OldTime)>=FReadTotalTime then
          Break;
      if ExitWait or ProcDestroying or (csDestroying in ComponentState) then
      begin
        ExitWait:=False;
        Break;
      end;
      if InMainThread then
      begin
        Sleep(2);
        Application.ProcessMessages;
      end
      else
        Sleep(5);
    end;
  end;
  FLastError:=sio_read(FintPort,Buffer,Count);
  if FLastError>=0 then
    Result:=FLastError;
end;

function TPort.ReadString(var Str: string; Count: integer): integer;
var
  Buffer:PChar;
  i:integer;
  OldTime:Cardinal;
begin
  FLastError:=SIO_BADPORT;
  Result:=0;
  str:='';
  if not FPortOpened then
    Exit;
  if (FReadTotalTime>=0) then
  begin
    OldTime:=GetTickCount;
    while True do
    begin
      if Iqueue>=Count then Break;
      if FReadTotalTime>0 then
        if Abs(GetTickCount-OldTime)>=FReadTotalTime then
          Break;
      if ExitWait or ProcDestroying or (csDestroying in ComponentState) then
      begin
       ExitWait:=False;
       Break;
      end;
      if InMainThread then
      begin
        Sleep(2);
        Application.ProcessMessages;
      end
      else
        Sleep(5);
    end;
  end;
  GetMem(Buffer,Count);
  FLastError:=sio_read(FintPort,Buffer,Count);
  if FLastError>=0 then
  begin
    Result:=FLastError;
    SetLength(str,Result);
    for i:=1 to Result do
      str[i]:=Buffer[i-1];
  end;
  FreeMem(Buffer,Count);
end;

procedure TPort.SetBaudRate(Value: TBaudRate);
var
  intBaudRate:integer;
  index:integer;
begin
  FLastError:=SIO_BADPORT;
  FBaudRate:=Value;
  if not FPortOpened then
    Exit;
  index:=Ord(Value);
  intBaudRate:=BaudRateconst[index];
  FLastError:=sio_baud(FintPort,intBaudRate);
end;

procedure TPort.SetCTSFlowControl(Value: Boolean);
var
  ret:integer;
begin
  FLastError:=SIO_BADPORT;
  FCTSFlowControl:=Value;
  if not FPortOpened then
    Exit;
  ret:=sio_getflow(FintPort);
  FLastError:=ret;
  if ret>=0 then
  begin
    if Value then
      ret:=ret or $1
    else
      ret:=ret and $FFFE;
    FLastError:=sio_flowctrl(FintPort,ret);
  end;
end;

procedure TPort.SetDataBits(Value: TDataBits);
begin
  FLastError:=SIO_BADPORT;
  FDataBits:=Value;
  if not FPortOpened then
    Exit;
  FLastError:=sio_ioctl(FintPort,Ord(FBaudRate),GetMode);
end;

procedure TPort.SetDTR(Value: Boolean);
begin
  FLastError:=SIO_BADPORT;
  FDTR:=Value;
  if not FPortOpened then
    Exit;
  if Value then
    FLastError:=sio_DTR(FintPort,1)
  else
    FLastError:=sio_DTR(FintPort,0);
end;

procedure TPort.SetParity(Value: TParityBits);
begin
  FLastError:=SIO_BADPORT;
  FParity:=Value;
  if not FPortOpened then
    Exit;
  FLastError:=sio_ioctl(FintPort,Ord(FBaudRate),GetMode);
end;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品妹子av| 日本电影欧美片| 久久精品国产亚洲5555| 香港成人在线视频| 日韩一区二区三| 欧美一区二区三区婷婷月色| 色婷婷综合久色| 欧美视频一区二区三区四区| 在线视频国内自拍亚洲视频| 欧美日韩国产小视频在线观看| 欧美色精品在线视频| 欧美丰满美乳xxx高潮www| 日韩一卡二卡三卡四卡| 久久蜜臀精品av| 一区在线播放视频| 午夜精品久久久久久久蜜桃app | 奇米色777欧美一区二区| 日韩电影一区二区三区四区| 日韩在线卡一卡二| 国产精品性做久久久久久| 91在线视频观看| 欧美日韩国产在线播放网站| 日韩欧美黄色影院| 国产人成亚洲第一网站在线播放| 久久无码av三级| 国产情人综合久久777777| 亚洲免费视频中文字幕| 亚洲一级二级三级在线免费观看| 亚洲一区二区三区视频在线播放 | 国产日韩三级在线| 一区二区欧美精品| 国产一区二区在线影院| 欧洲色大大久久| 久久一区二区三区四区| 一区二区三区国产豹纹内裤在线| 青青草视频一区| 色综合色狠狠综合色| 精品欧美一区二区三区精品久久| 国产精品国产三级国产普通话蜜臀 | 欧美成人在线直播| 亚洲免费在线看| 国产美女精品人人做人人爽| 色综合天天综合网天天看片| 欧美mv和日韩mv国产网站| 亚洲欧洲日产国码二区| 男男成人高潮片免费网站| 97久久超碰国产精品| 精品成人一区二区三区四区| 夜夜操天天操亚洲| 成人免费视频网站在线观看| 欧美精品电影在线播放| 亚洲品质自拍视频| 狠狠色丁香久久婷婷综合丁香| 91天堂素人约啪| 欧美国产激情一区二区三区蜜月| 亚洲免费三区一区二区| 国产 欧美在线| 欧美一区二区黄色| 午夜视频一区二区| 91麻豆国产福利在线观看| 国产网站一区二区| 国产麻豆精品theporn| 91精品免费在线| 久久精品一区四区| 日韩国产欧美视频| 91蜜桃婷婷狠狠久久综合9色| 国产三级精品在线| 国产99久久久精品| 欧美—级在线免费片| 欧美一区二区三区四区高清| 一区二区三区视频在线观看| 国产一区二区三区蝌蚪| 欧美tickling挠脚心丨vk| 男女男精品视频| 91精品国产综合久久精品app| 国产精品色一区二区三区| 成人夜色视频网站在线观看| 久久精品日产第一区二区三区高清版 | 顶级嫩模精品视频在线看| 久久精品男人的天堂| 福利一区在线观看| 中文字幕一区二区三区在线不卡| 成人午夜激情片| 亚洲日穴在线视频| 色妹子一区二区| 亚洲h在线观看| 7777精品伊人久久久大香线蕉| 亚洲电影你懂得| 国产精品久久久久久久午夜片| 国产sm精品调教视频网站| 色婷婷综合久色| 一区在线播放视频| 91蝌蚪porny| 亚洲成人黄色小说| 欧美日韩一区二区三区不卡| 天天做天天摸天天爽国产一区| 欧美日韩大陆在线| 精品一区二区三区在线播放| 精品国产制服丝袜高跟| 国产精品资源在线看| 国产视频一区在线播放| 成人av电影免费观看| 亚洲国产综合色| 精品免费日韩av| 91婷婷韩国欧美一区二区| 免费成人在线网站| 欧美国产在线观看| 7777精品伊人久久久大香线蕉最新版 | 成人av资源在线观看| 亚洲国产日产av| 欧美激情艳妇裸体舞| 欧美色图激情小说| 蜜桃视频一区二区三区| 亚洲欧洲av在线| 337p亚洲精品色噜噜| 成人av综合在线| 精品无人区卡一卡二卡三乱码免费卡 | 中文字幕一区二区三区av| 欧美美女黄视频| 本田岬高潮一区二区三区| 日本欧美肥老太交大片| 亚洲素人一区二区| 久久久久久久久岛国免费| 欧美日韩免费不卡视频一区二区三区| 国产精品一区二区不卡| 日本欧美在线看| 亚洲图片一区二区| 日韩一区欧美一区| 国产日韩欧美制服另类| 日韩欧美一区二区久久婷婷| 在线观看日韩国产| 国产精品一区免费视频| 日韩精品亚洲专区| 一区二区三区在线免费观看 | 欧美日韩精品系列| 99视频一区二区| 成人小视频免费在线观看| 日本伊人色综合网| 亚洲制服丝袜在线| 亚洲精品欧美专区| 中文字幕在线观看不卡| 亚洲国产精品成人综合| 国产色产综合产在线视频| 精品999在线播放| 欧美精品一区二区三| 欧美一区二区三区免费视频| 欧美在线色视频| 91蜜桃视频在线| 99久久久久久99| 91麻豆精品秘密| 91麻豆免费看| 99久久精品国产导航| 色乱码一区二区三区88| 色先锋久久av资源部| 色哟哟一区二区| 欧美性淫爽ww久久久久无| 欧美日韩精品综合在线| 欧美曰成人黄网| 91精品国产综合久久久久| 日韩美一区二区三区| 久久综合色鬼综合色| 国产午夜精品在线观看| 国产欧美日韩中文久久| 久久久久一区二区三区四区| 国产欧美日韩精品在线| 精品乱人伦小说| 国产精品国产三级国产普通话蜜臀| 成人欧美一区二区三区白人| 亚洲精品美国一| 蜜桃在线一区二区三区| 粉嫩av一区二区三区| av高清久久久| 欧美日韩高清在线播放| 欧美精品一区二| 国产精品欧美一区喷水| 亚洲国产精品久久不卡毛片| 日本成人在线网站| 国产成人精品免费网站| 欧美在线一二三| 欧美精品一区二区久久久| 亚洲欧美视频在线观看| 日韩电影一区二区三区| 成人av资源网站| 538prom精品视频线放| 国产精品污www在线观看| 亚洲国产成人tv| 国产精品系列在线观看| 欧美日韩电影在线| 国产亚洲成av人在线观看导航| 亚洲黄色av一区| 国产精品自拍av| 555www色欧美视频| 中文字幕综合网| 黄网站免费久久| 欧美色网站导航| 中文字幕一区二区三区精华液| 日本不卡在线视频| 91福利小视频| 国产精品色哟哟| 国产麻豆精品视频|