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

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

?? os2com.pas

?? 提供串行口存取的 Object Pascal 類 ( 1.2 版
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit OS2COM;
{.$DEFINE WITH_DEBUG}
(*
**
** Serial and TCP/IP communication routines for DOS, OS/2 and Win9x/NT.
** Tested with: TurboPascal   v7.0,    (DOS)
**              VirtualPascal v2.1,    (OS/2, Win32)
**              FreePascal    v0.99.12 (DOS, Win32)
**              Delphi        v4.0.    (Win32)
**
** Version : 1.01
** Created : 21-May-1998
** Last update : 12-May-1999
**
** Note: (c) 1998-1999 by Maarten Bekers
**
*)

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
 INTERFACE
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

uses Combase, BufUnit, Threads, Debug_U, LongStr
     {$IFDEF OS2}
       ,Os2Base
     {$ENDIF}

     {$IFDEF VirtualPascal}
       ,Use32
     {$ENDIF};

Const WriteTimeout   = 20000;                             { Wait max. 20 secs }
      ReadTimeOut    = 20000;                    { General event, 20 secs max }

      InBufSize      = 1024 * 32;
      OutBufSize     = 1024 * 32;

type TOs2Obj = Object(TCommObj)
        ReadProcPtr: Pointer;             { Pointer to TX/RX handler (thread) }
        WriteProcPtr: Pointer;            { Pointer to TX/RX handler (thread) }
        ThreadsInitted: Boolean;          { Are the thread(s) up and running? }

        ClientHandle  : Longint;

        InBuffer      : ^BufArrayObj;             { Buffer system internally used }
        OutBuffer     : ^BufArrayObj;

        DoTxEvent     : PSysEventObj; { Event manually set when we have to transmit }
        DoRxEvent     : PSysEventObj;      { Event manually set when we need data }

        TxClosedEvent : PSysEventObj;    { Event set when the Tx thread is closed }
        RxClosedEvent : PSysEventObj;    { Event set when the Rx thread is closed }

        CriticalTx    : PExclusiveObj;                        { Critical sections }
        CriticalRx    : PExclusiveObj;

        TxThread      : PThreadsObj;           { The Transmit and Receive threads }
        RxThread      : PThreadsObj;

        EndThreads    : Boolean;    { Set to true when we have to end the threads }

        constructor Init;
        destructor Done;

        function  Com_Open(Comport: Byte; BaudRate: Longint; DataBits: Byte;
                           Parity: Char; StopBits: Byte): Boolean; virtual;
        function  Com_OpenKeep(Comport: Byte): Boolean; virtual;
        function  Com_GetChar: Char; virtual;
        function  Com_CharAvail: Boolean; virtual;
        function  Com_Carrier: Boolean; virtual;
        function  Com_SendChar(C: Char): Boolean; virtual;
        function  Com_ReadyToSend(BlockLen: Longint): Boolean; virtual;
        function  Com_GetBPSrate: Longint; virtual;
        function  Com_GetHandle: Longint; virtual;

        procedure Com_OpenQuick(Handle: Longint); virtual;
        procedure Com_Close; virtual;
        procedure Com_SendBlock(var Block; BlockLen: Longint; var Written: Longint); virtual;
        procedure Com_ReadBlock(var Block; BlockLen: Longint; var Reads: Longint); virtual;
        procedure Com_GetBufferStatus(var InFree, OutFree, InUsed, OutUsed: Longint); virtual;
        procedure Com_SetDtr(State: Boolean); virtual;
        procedure Com_GetModemStatus(var LineStatus, ModemStatus: Byte); virtual;
        procedure Com_SetLine(BpsRate: longint; Parity: Char; DataBits, Stopbits: Byte); virtual;
        procedure Com_PurgeInBuffer; virtual;
        procedure Com_PurgeOutBuffer; virtual;
        procedure Com_FlushOutBuffer(Slice: SliceProc); virtual;

        procedure Com_PauseCom(CloseCom: Boolean); virtual;
        procedure Com_ResumeCom(OpenCom: Boolean); virtual;
        procedure Com_SetFlow(SoftTX, SoftRX, Hard: Boolean); virtual;

        procedure Com_SetDataProc(ReadPtr, WritePtr: Pointer); virtual;

        procedure Com_ReadProc(var TempPtr: Pointer);
        procedure Com_WriteProc(var TempPtr: Pointer);

        function  Com_StartThread: Boolean;
        procedure Com_InitVars;
        procedure Com_StopThread;
     end; { object TOs2Obj }

Type POs2Obj = ^TOs2Obj;

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
 IMPLEMENTATION
(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

uses SysUtils;

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

constructor TOs2Obj.Init;
begin
  inherited Init;

  Com_InitVars;
  ThreadsInitted := FALSE;
end; { constructor Init }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

destructor TOs2Obj.Done;
begin
  inherited done;
end; { destructor Done }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

procedure TOs2Obj.Com_ReadProc(var TempPtr: Pointer);
Type TBuffRec = Record
         BytesIn   : SmallWord;               { Number of bytes in the buffer }
         MaxSize   : SmallWord;                     { Full size of the buffer }
     end; { TBuffRec }

var Available : Boolean;
    BytesRead : Longint;
    BlockLen  : Longint;
    ReturnCode: Longint;
    BufferRec : TBuffRec;
begin
  repeat
     if DoRxEvent.WaitForEvent(ReadTimeOut) then
      if NOT EndThreads then
       begin
         CriticalRx.EnterExclusive;
         ReturnCode := 0;
         DosDevIoCtl(ClientHandle,                             { File-handle }
                     ioctl_Async,                                 { Category }
                     async_GetInQueCount,                         { Function }
                     nil,                                           { Params }
                     ReturnCode,                          { Max param length }
                     @ReturnCode,                             { Param Length }
                     @BufferRec,                             { Returned data }
                     SizeOf(TBuffRec),                     { Max data length }
                     @ReturnCode);                             { Data length }

         Available := (BufferRec.BytesIn > 00);

         DoRxEvent.ResetEvent;

         if Available then
          begin
            {----------- Start reading the gathered date -------------------}

            if InBuffer^.BufRoom > 0 then
              begin
                BlockLen := BufferRec.BytesIn;
                if BlockLen > InBuffer^.BufRoom then
                  BlockLen := InBuffer^.BufRoom;
                if BlockLen > 1024 then
                  BlockLen := 1024;

                if BlockLen > 00 then
                 begin
                   DosRead(ClientHandle,
                           InBuffer^.TmpBuf^,
                           BlockLen,
                           BytesRead);

                   InBuffer^.Put(InBuffer^.TmpBuf^, BytesRead);
                 end; { if }

              end; { if }
          end; { if available }

         CriticalRx.LeaveExclusive;
       end; { if RxEvent }
  until EndThreads;

  RxClosedEvent.SignalEvent;
  ExitThisThread;
end; { proc. ComReadProc }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

procedure TOs2Obj.Com_WriteProc(var TempPtr: Pointer);
var BlockLen    : Longint;
    Written     : Longint;
    ReturnCode  : Longint;
    TempBuf     : ^CharBufType;
begin
  New(TempBuf);

  repeat
     if DoTxEvent.WaitForEvent(WriteTimeOut) then
      if NOT EndThreads then
       begin
         CriticalTx.EnterExclusive;
         DoTxEvent.ResetEvent;

         if OutBuffer^.BufUsed > 00 then
           begin
             Written := 00;
             BlockLen := OutBuffer^.Get(OutBuffer^.TmpBuf^, OutBuffer^.BufUsed, false);

             DosWrite(ClientHandle,
                      OutBuffer^.TmpBuf^,
                      BlockLen,
                      Written);

             ReturnCode := OutBuffer^.Get(OutBuffer^.TmpBuf^, Written, true);
             if Written <> BlockLen then
                DoTxEvent.SignalEvent;
           end; { if }

         CriticalTx.LeaveExclusive;
       end; { if }

  until EndThreads;

  Dispose(TempBuf);
  TxClosedEvent.SignalEvent;
  ExitThisThread;
end; { proc. ComWriteProc }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

function TOs2Obj.Com_StartThread: Boolean;
begin
  Result := false;
  EndThreads := false;
  if ThreadsInitted then EXIT;
  ThreadsInitted := true;

  {----------------------- Create all the events ----------------------------}
  New(DoTxEvent, Init);
  if NOT DoTxEvent.CreateEvent(false) then EXIT;

  New(DoRxEvent, Init);
  if NOT DoRxEvent.CreateEvent(false) then EXIT;

  New(RxClosedEvent, Init);
  if NOT RxClosedEvent.CreateEvent(false) then EXIT;

  New(TxClosedEvent, Init);
  if NOT TxClosedEvent.CreateEvent(false) then EXIT;


  {-------------- Startup the buffers and overlapped events -----------------}
  New(InBuffer, Init(InBufSize));
  New(OutBuffer, Init(OutBufSize));

  if (InBuffer^.TxtArr=nil) OR (InBuffer^.TmpBuf=nil) then EXIT;
  if (OutBuffer^.TxtArr=nil) OR (OutBuffer^.TmpBuf=nil) then EXIT;

  {-------------------- Startup a seperate write thread ---------------------}
  New(CriticalTx, Init);
  CriticalTx.CreateExclusive;

  New(TxThread, Init);
  if NOT TxThread.CreateThread(16384,                            { Stack size }
                               WriteProcPtr,               { Actual procedure }
                               nil,                              { Parameters }
                               0)                            { Creation flags }
                                 then EXIT;

  {-------------------- Startup a seperate read thread ----------------------}
  New(CriticalRx, Init);
  CriticalRx.CreateExclusive;

  New(RxThread, Init);
  if NOT RxThread.CreateThread(16384,                            { Stack size }
                               ReadProcPtr,                { Actual procedure }
                               nil,                              { Parameters }
                               0)                            { Creation flags }
                                 then EXIT;

  Result := true;
end; { proc. Com_StartThread }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

procedure TOs2Obj.Com_InitVars;
begin
  DoTxEvent := nil;
  DoRxEvent := nil;
  RxClosedEvent := nil;
  TxClosedEvent := nil;
  TxThread := nil;
  RxThread := nil;

  InBuffer := nil;
  OutBuffer := nil;
  CriticalRx := nil;
  CriticalTx := nil;
end; { proc. Com_InitVars }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

procedure TOs2Obj.Com_StopThread;
begin
  EndThreads := true;
  ThreadsInitted := false;

  if DoTxEvent <> nil then DoTxEvent.SignalEvent;
  if DoTxEvent <> nil then DoRxEvent.SignalEvent;


  if TxThread <> nil then TxThread.CloseThread;
  if RxThread <> nil then RxThread.CloseThread;

  if TxClosedEvent <> nil then
   if NOT TxClosedEvent^.WaitForEvent(1000) then
     TxThread.TerminateThread(0);

  if RxClosedEvent <> nil then
   if NOT RxClosedEvent^.WaitForEvent(1000) then
     RxThread.TerminateThread(0);

  if TxThread <> nil then TxThread.Done;
  if RxThread <> nil then RxThread.Done;

  if DoTxEvent <> nil then Dispose(DoTxEvent, Done);
  if DoRxEvent <> nil then Dispose(DoRxEvent, Done);
  if RxClosedEvent <> nil then Dispose(RxClosedEvent, Done);
  if TxClosedEvent <> nil then Dispose(TxClosedEvent, Done);

  if CriticalTx <> nil then Dispose(CriticalTx, Done);
  if CriticalRx <> nil then Dispose(CriticalRx, Done);

  if InBuffer <> nil then Dispose(InBuffer, Done);
  if OutBuffer <> nil then Dispose(OutBuffer, Done);

  Com_InitVars;
end; { proc. Com_StopThread }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

function TOs2Obj.Com_GetHandle: Longint;
begin
  Result := ClientHandle;
end; { func. Com_GetHandle }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

procedure TOs2Obj.Com_OpenQuick(Handle: Longint);
begin
  ClientHandle := Handle;

  InitFailed := NOT Com_StartThread;
end; { proc. TOs2Obj.Com_OpenQuick }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

function TOs2Obj.Com_OpenKeep(Comport: Byte): Boolean;
var ReturnCode: Longint;
    OpenAction: Longint;
    Temp       : Array[0..15] of Char;
begin
  InitFailed := NOT Com_StartThread;

  if NOT InitFailed then
    begin
      OpenAction := file_Open;
      StrpCopy(Temp, 'COM' + IntToStr(ComPort));

      ReturnCode :=
        DosOpen(Temp,                                    { Filename, eg: COM2 }
                ClientHandle,
                OpenAction,
                0,                                                 { Filesize }
                0,                                               { Attributes }
                FILE_OPEN or OPEN_ACTION_OPEN_IF_EXISTS,         { Open flags }
                OPEN_ACCESS_READWRITE or OPEN_SHARE_DENYNONE or    { OpenMode }
                OPEN_FLAGS_FAIL_ON_ERROR,
                nil);                                   { Extended attributes }

      InitFailed := (ReturnCode <> 0);
    end; { if }

  Com_OpenKeep := NOT InitFailed;
end; { func. Com_OpenKeep }

(*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)

function TOs2Obj.Com_Open(Comport: Byte; BaudRate: Longint; DataBits: Byte;
                            Parity: Char; StopBits: Byte): Boolean;
begin
  InitFailed := true;

  if Com_OpenKeep(Comport) then
    begin
      Com_SetLine(BaudRate, Parity, DataBits, StopBits);

      InitFailed := false;
    end; { if }

  Com_Open := NOT InitFailed;
end; { func. TOs2Obj.Com_OpenCom }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
777久久久精品| 在线亚洲精品福利网址导航| 成人国产免费视频| 欧美巨大另类极品videosbest | 日韩精品成人一区二区三区| 国产精品一区二区果冻传媒| 欧美视频第二页| 国产精品女人毛片| 美女网站一区二区| 在线国产电影不卡| 国产精品久久久久aaaa樱花| 精品一区二区免费在线观看| 欧美无乱码久久久免费午夜一区| 中文在线一区二区| 日本亚洲欧美天堂免费| 欧洲在线/亚洲| 亚洲欧洲日产国产综合网| 国产一区二区三区日韩| 制服丝袜成人动漫| 亚洲午夜羞羞片| 99精品在线观看视频| 国产午夜精品一区二区三区嫩草| 九九在线精品视频| 欧美一级在线视频| 日韩和欧美的一区| 欧美久久一区二区| 三级亚洲高清视频| 欧美精品在线一区二区| 亚洲第一精品在线| 在线观看成人免费视频| 亚洲美女视频在线观看| 色综合久久久网| 亚洲色图在线看| 色噜噜狠狠一区二区三区果冻| 欧美国产精品中文字幕| 国产黑丝在线一区二区三区| 精品国产亚洲在线| 狠狠色丁香九九婷婷综合五月| 欧美一区二区三区思思人| 日韩av中文字幕一区二区三区| 欧美日本一道本| 五月综合激情网| 日韩午夜电影在线观看| 黄页视频在线91| 久久天天做天天爱综合色| 激情文学综合丁香| 国产精品久久久久久妇女6080 | 中文字幕一区二区视频| 成人动漫在线一区| 日韩伦理av电影| 欧美视频三区在线播放| 日韩va欧美va亚洲va久久| www成人在线观看| 福利一区二区在线| 亚洲女人的天堂| 欧美日韩的一区二区| 久久成人免费电影| 国产精品情趣视频| 91久久精品国产91性色tv| 亚洲成人免费在线观看| 日韩丝袜情趣美女图片| 国产精品1024久久| 一区二区三区 在线观看视频| 欧美日本免费一区二区三区| 国产乱码精品1区2区3区| 国产精品久久久久久福利一牛影视| 欧美在线|欧美| 久草这里只有精品视频| 亚洲天堂成人网| 欧美成人伊人久久综合网| 成人免费毛片嘿嘿连载视频| 亚洲成人av在线电影| 国产人妖乱国产精品人妖| 色先锋aa成人| 国产乱子轮精品视频| 一区二区三区中文在线观看| 日韩欧美中文字幕公布| 成人动漫一区二区| 久久精品国产99久久6| 亚洲欧美怡红院| 欧美xfplay| 欧美午夜精品理论片a级按摩| 国内偷窥港台综合视频在线播放| 亚洲精品成人悠悠色影视| 精品久久久久久久久久久久包黑料 | 精品动漫一区二区三区在线观看| 成人av电影在线观看| 首页国产欧美久久| 亚洲免费资源在线播放| 精品少妇一区二区| 欧美日韩精品系列| 99久久久无码国产精品| 经典三级在线一区| 免费成人在线影院| 亚洲国产精品久久人人爱| 国产精品久久久久一区二区三区| 日韩欧美在线一区二区三区| 欧美日韩免费观看一区二区三区 | 国产综合色产在线精品| 日韩精品一二三区| 亚洲国产视频网站| 亚洲欧美电影一区二区| 中文字幕av资源一区| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美精品三级在线观看| 欧洲国产伦久久久久久久| 色综合 综合色| 91浏览器在线视频| 成人av在线播放网址| 国产高清精品久久久久| 免费高清在线一区| 毛片av一区二区| 琪琪一区二区三区| 久久精品国产久精国产| 久久99精品久久久久久动态图| 日本欧美久久久久免费播放网| 日本在线不卡视频一二三区| 天天影视涩香欲综合网| 日本成人在线电影网| 三级欧美在线一区| 另类人妖一区二区av| 美国三级日本三级久久99| 久久精品国产亚洲一区二区三区 | 亚洲第一电影网| 亚洲午夜一区二区| 日本欧美在线观看| 国产一区二区影院| 成人美女在线观看| 色综合久久99| 欧美片在线播放| 精品国产乱码久久久久久夜甘婷婷 | 另类综合日韩欧美亚洲| 午夜欧美在线一二页| 亚洲成人综合在线| 精品亚洲欧美一区| 激情综合五月婷婷| 精品一区二区三区免费播放| 精品一区二区在线免费观看| 国产成人综合亚洲91猫咪| 国产一区二区导航在线播放| 国内偷窥港台综合视频在线播放| 久久精品99国产精品日本| 美女视频免费一区| 成人听书哪个软件好| 成人av网站免费观看| 成人高清免费观看| 色婷婷综合久久久久中文一区二区| 免费成人你懂的| 丁香天五香天堂综合| 成人综合在线观看| 91免费看`日韩一区二区| 欧美色网站导航| 日韩午夜电影av| 亚洲国产高清不卡| 亚洲天堂福利av| 午夜日韩在线观看| 美国十次了思思久久精品导航| av高清不卡在线| 欧美日韩一级二级| 久久蜜桃av一区二区天堂| 国产精品久久毛片av大全日韩| 天堂资源在线中文精品| 精品亚洲国产成人av制服丝袜 | 午夜电影一区二区| 国产在线一区二区综合免费视频| 不卡av免费在线观看| 欧美美女一区二区三区| 精品久久久久久最新网址| 亚洲国产精品二十页| 亚洲国产一区视频| 国产精品91一区二区| 色婷婷综合中文久久一本| 91精品国产综合久久久蜜臀粉嫩| 久久久综合精品| 日本午夜精品一区二区三区电影| 国产精品99久久久久久有的能看 | 欧美一卡在线观看| 国产精品第四页| 日本一不卡视频| 国产成人精品亚洲日本在线桃色| 成熟亚洲日本毛茸茸凸凹| 91日韩在线专区| 中文字幕乱码亚洲精品一区| 亚洲午夜精品在线| 国产福利一区在线| 久久综合av免费| 亚洲电影一区二区| 国产99久久久国产精品| 欧美日韩一区二区三区高清| 欧美日本一道本在线视频| 一片黄亚洲嫩模| 成人深夜在线观看| 日韩免费高清av| 亚洲男人电影天堂| 色网综合在线观看| 国产精品区一区二区三区| 国产一区二区三区在线观看免费视频| 成人av资源站| 日韩毛片精品高清免费| 老鸭窝一区二区久久精品|