TIP: Click on subject to list as thread! ANSI
echo: maxdev
to: Frank McCormick
from: Thomas W. Mueller
date: 1998-10-25 22:26:54
subject: Comm init problem

Tach Frank!

am 13 Oct 98 um 08:09:56 schrieb Frank McCormick an all:

 FM> The code I use to initialize the com port is as follows;

 FM> Function ModemInit(P: Byte; var PHandle: HFile): Boolean;
 FM> var
 FM>   Com: string[6];
 FM>   Action: ulong;
 FM>   Error: apiret;
 FM> Begin
 FM>   Com := 'COM' + Char(P + 48) + #0;
 FM>   Error := DosOpen({at}Com[1], PHandle, Action, 0, $0000,
 FM>                    OPEN_ACTION_OPEN_IF_EXISTS, OPEN_ACCESS_READWRITE OR
 FM>                    OPEN_SHARE_DENYNONE, nil);
 FM>   if Error  NO_ERROR then PHandle := 0;
 FM>   FPort := PHandle;
 FM>   if PHandle = 0 then ModemInit := FALSE else ModemInit := TRUE;
 FM> End;
This is code to open an inactive COM port. You don't need to do that since
you have already an active handle. So just use it. Just for the fun of it
here some of my code (used in MxXEd/2). It creates a custom
"devicedriver" so I can just use standard Read and Write
functions on a TEXT file variable. If you like it, feel free to use it but
mention my name somewhere.

UNIT uTWMComFile;

INTERFACE

USES
  Use32,
  OS2Def,
  OS2Base,
  VPUtils,
  SysUtils;

TYPE
  eComPort = CLASS( exception )
  END;

  tWatchdogErrorCodes = (weCarrierLost, weTimeout, wePortClosed);
  tWatchdogErrorProc = PROCEDURE(_ErrCode: tWatchdogErrorCodes);
  tWatchdogTimeoutProc = PROCEDURE(_TenthsRemaining: SmallInt);

  pComPortRec = ^tComPortRec;
  tComPortRec = RECORD
                  WatchdogThreadHandle: TID;
                  WatchdogInactivity: SmallInt;
                  WatchdogMaxInactivity: SmallInt;
                  WatchdogErrorProc: tWatchdogErrorProc;
                  WatchdogTimeoutProc: tWatchdogTimeoutProc;
                END;

PROCEDURE ComPortAssignHandle(VAR _F: TEXT; _ComHandle: hFile;
                              _Timeout: SmallInt;
                              _TimeoutProc: tWatchdogTimeoutProc;
                              _ErrorProc: tWatchdogErrorProc);
FUNCTION  ComPortGetBaudrate(VAR _F: TEXT): SmallWord;
FUNCTION  ComPortCheckCarrier(VAR _F: TEXT): BOOLEAN;
FUNCTION  ComPortSetMaxInactivity(VAR _F: TEXT; _Tenths: SmallInt): SmallInt;
FUNCTION  ComPortGetMaxInactivity(VAR _F: TEXT): SmallInt;
FUNCTION  ComPortReadChar(VAR _F: TEXT; VAR c: Char): BOOLEAN;

IMPLEMENTATION

FUNCTION ComPortReadChar(VAR _F: TEXT; VAR c: Char): BOOLEAN;
VAR
  rc: ApiRet;
  BytesRead: ULONG;
BEGIN
  rc := DosRead(tTextRec(_F).Handle, c, 1, BytesRead);
  IF rc0 THEN
    Raise eComPort.CreateFmt('RemoteReadCharNoWait.DosRead, rc=%d',[rc]);
  Result := (BytesRead=1);
  IF Result THEN
    WITH pComPortRec({at}tTextRec(_F).UserData)^ DO
      WatchdogInactivity:=WatchdogMaxInactivity;
END;

FUNCTION ComPortCheckCarrier(VAR _F: TEXT): BOOLEAN;
  VAR
    Status : BYTE;
    Bytes : ULONG;
    Dummy : ULONG;
    rc : APIRet;
  BEGIN
  rc:=DosDevIOCtl(tTextRec(_F).Handle,IOCTL_ASYNC,ASYNC_GETMODEMINPUT,
                  NIL,0,{at}Dummy,
                  {at}Status,SizeOf(Status),{at}Bytes);
  Result:=(Status AND $80)>0;
END;

FUNCTION ComPortGetBaudrate(VAR _F: TEXT): SmallWord;
  VAR
    Baudrate : USHORT;
    Bytes : ULONG;
    Dummy : ULONG;
    rc : APIRet;
  BEGIN
  rc:=DosDevIOCtl(tTextRec(_F).Handle,IOCTL_ASYNC,ASYNC_GETBAUDRATE,
                  NIL,0,{at}Dummy,
                  {at}Baudrate,SizeOf(Baudrate),{at}Bytes);
  Result:=Baudrate;
END;

FUNCTION ComPortWatchdogFunc( _pF: POINTER): LongInt;
  VAR
    F: ^tTextRec;
    WasInactive: BOOLEAN;
  BEGIN
  F := _pF;
  WasInactive := true;
  WITH pComPortRec({at}F^.UserData)^ DO BEGIN
    REPEAT
      DosSleep(100);
      IF F^.Mode=fmClosed THEN BEGIN
        IF Assigned(WatchdogErrorProc) THEN
          WatchdogErrorProc(wePortClosed);
        DosExit(0, 0);
      END;
      IF WatchdogMaxInactivity=-1 THEN
        WasInactive:=True
      ELSE BEGIN
        IF WasInactive THEN BEGIN
          WatchdogInactivity:=WatchdogMaxInactivity;
          WasInactive := False;
        END;
        Dec(WatchdogInactivity);
        IF Assigned(WatchdogTimeoutProc) THEN
          WatchdogTimeoutProc(WatchdogInactivity);
        IF NOT ComPortCheckCarrier(TEXT(F^)) THEN BEGIN
          IF Assigned(WatchdogErrorProc) THEN
            WatchdogErrorProc(weCarrierLost);
          DosExit(0, 0);
        END;
      END;
    UNTIL (WatchdogInactivity=0);
    IF Assigned(WatchdogErrorProc) THEN
      WatchdogErrorProc(weTimeout);
  END;
  DosExit(0, 0);
END;

FUNCTION  ComPortSetMaxInactivity(VAR _F: TEXT; _Tenths: SmallInt): SmallInt;
  BEGIN
  WITH pComPortRec({at}tTextRec(_F).UserData)^ DO BEGIN
    Result := WatchdogMaxInactivity;
    WatchdogMaxInactivity := _Tenths;
  END;
END;

FUNCTION  ComPortGetMaxInactivity(VAR _F: TEXT): SmallInt;
  BEGIN
  Result := pComPortRec({at}tTextRec(_F).UserData)^.WatchdogMaxInactivity;
END;

// Device driver functions

FUNCTION ComPortWrite(VAR _F: tTextRec): LongInt;
  VAR
    Written:LongInt;
  BEGIN
  WITH _F DO BEGIN
    Result:=DosWrite(Handle,BufPtr^,BufPos,Written);
    BufPos:=0;
    DosResetBuffer(Handle)
  END;
END;

FUNCTION ComPortRead(VAR _F: tTextRec): Longint;
  VAR
    Count:LongInt;
  BEGIN
  WITH _F DO BEGIN
    REPEAT
      Result:=DosRead(Handle,(BufPtr+BufPos)^,BufSize-BufPos,Count);
      IF Result=0 THEN BEGIN
        Inc(BufEnd,Count);
        WITH pComPortRec({at}_F.UserData)^ DO
          WatchdogInactivity := WatchdogMaxInactivity;
      END ELSE
        Exit;
    UNTIL Count>0;
  END;
END;

FUNCTION ComPortReturn(VAR _F: tTextRec): LongInt;
  BEGIN
  Result:=0;
END;

FUNCTION ComPortOpen(VAR _F: tTextRec): LongInt;
  BEGIN
  WITH _F DO BEGIN
    CloseFunc := {at}ComPortReturn;
    IF Mode=fmInput THEN BEGIN
      InOutFunc:={at}ComPortRead;
      FlushFunc:={at}ComPortReturn;
    END ELSE BEGIN
      Mode := fmOutput;
      InOutFunc := {at}ComPortWrite;
      FlushFunc := {at}ComPortWrite;
    END;
  END;;
  Result:=0;                 { I/O result = 0: success }
END;

PROCEDURE ComPortAssignHandle(VAR _F: TEXT; _ComHandle: hFile;
                              _Timeout: SmallInt;
                              _TimeoutProc: tWatchdogTimeoutProc;
                              _ErrorProc: tWatchdogErrorProc);
  BEGIN
  WITH tTextRec(_F) DO BEGIN
    Handle := _ComHandle;
    Mode := fmClosed;
    BufSize := SizeOf(Buffer);
    BufPtr := {at}Buffer;
    OpenFunc := {at}ComPortOpen;
    StrCopy({at}Name,'HotComPortHandle');
    WITH pComPortRec({at}UserData)^ DO BEGIN
      WatchdogMaxInactivity := _Timeout;
      WatchdogTimeoutProc := _TimeoutProc;
      WatchdogErrorProc := _ErrorProc;
      WatchdogThreadHandle := VPBeginThread( ComPortWatchdogFunc, 8192, {at}_F );
    END;
  END;
END;

END.

MfG :-)
Thomas

--- MxXEd/2 1.02
* Origin: ... the OS/2 native external msgeditor for Maximus (2:2454/917)
SEEN-BY: 396/1 632/0 371 633/210 260 267 270 284 371 635/506 725 728 639/252
SEEN-BY: 670/218
@PATH: 2454/917 20/11 24/888 396/1 633/260 635/506 728 633/267

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.