sprouse@cory.Berkeley.EDU (Steven T. Sprouse) (09/26/87)
I have been trying, withouth success, to open the !@$##@$ Mac Serial ports. I think I have the driver and port open, but characters are not being acknowleged by my modem. (I wrote a dumb terminal program') If anyone could send me the source to a dumb terminal program I would appreciate it. Thank you very much, Steven T. Sprouse
singer@endor.harvard.edu (Andrew Singer) (09/28/87)
Here is some code. This is mine, and THINK does not provide any support or guarantee the quality, but I'll help you with it if you have problems. --Rich UNIT ModemIO; {This unit will read and write ASCII strings using the modem port.} INTERFACE {exported variables} CONST {names of the ROM serial driver for the modem port} ModemIn = '.AIn'; ModemOut = '.AOut'; {other handy constants} Cr = 13; {ASCII code of CR} Lf = 10; {ASCII code of LF} XOnChar = $11; XOffChar = $13; ModemInputRefNum = -6; ModemOutputRefNum = -7; {data input lengths for various instruments} HP3478 = 13; HP5386 = 19; HP5316 = 21; HP5328 = 17; HP3455 = 15; Nic1170 = 65; {functions to converse with the modem port} FUNCTION InitModemPort : OSErr; {initialize the port} FUNCTION Configure (Settings : Integer) : OSErr; {configure the port} FUNCTION XMitBuf (buf : Ptr; len : Integer) : OSErr; {send any buffer} FUNCTION XMitChar (c : Char) : OSErr; {send a character} FUNCTION XMitString (str : Str255) : OSErr; {send a string} FUNCTION XMitCRLF : OSErr; {sends a CRLF} FUNCTION XMitLine (str : Str255) : OSErr; {send a string followed by CRLF} FUNCTION RecvBuf (buf : Ptr; len : LongInt) : OSErr; {get a buffer} FUNCTION RecvChar (VAR c : Char) : OSErr; {get a single character} FUNCTION RecvFixedString (VAR Str : Str255; len : Integer) : OSErr; {get a string of known length} FUNCTION RecvString (VAR str : Str255) : OSErr; {get a string of unknown length} PROCEDURE Wait (ticks : LongInt); {delay for the number specified in 60ths of a sec} PROCEDURE GetLineFeed (refNum : Integer; {Read all chars in the input buffer, up to and including} VAR s : Str255); {the first linefeed.} FUNCTION XMitInt (i : Integer) : OSErr; {Send an integer in binary form -- useful for control chars} FUNCTION XMitLong (l : LongInt) : OSErr; {Send a LongInt in binary form} IMPLEMENTATION PROCEDURE GetLineFeed; VAR charsIn, count, Base : LongInt; err : OSErr; index : Integer; BEGIN index := 1; s := ' '; err := SerGetBuf(RefNum, count); charsIn := 1; Base := Ord4(@s); WHILE (count > 0) AND (s[index] <> chr(10)) DO BEGIN err := SerGetBuf(RefNum, count); IF count > 0 THEN BEGIN err := FSRead(RefNum, charsIn, Pointer(Base + Index)); IF err = noErr THEN index := index + 1; END; END; s[0] := chr(Index - 1); END; FUNCTION InitModemPort; VAR err : OSErr; HandShake : SerShk; boge : Integer; BEGIN err := OpenDriver(ModemIn, boge); err := OpenDriver(ModemOut, boge); WITH Handshake DO BEGIN fXOn := 0; fCTS := 0; errs := 0; evts := 0; fInX := 0; END; err := SerHShake(ModemInputRefNum, HandShake); err := SerHShake(ModemOutputRefNum, HandShake); InitModemPort := err; END; FUNCTION Configure; VAR err : OSErr; BEGIN err := SerReset(ModemInputRefNum, Settings); err := SerReset(ModemOutputRefNum, Settings); Configure := Err; END; FUNCTION XMitBuf; VAR count : LongInt; BEGIN count := len; XMitBuf := FSWrite(ModemOutputRefNum, count, Buf); END; FUNCTION XMitChar; VAR chars : PACKED ARRAY[0..1] OF Char; BEGIN chars[0] := c; XMitChar := XMitBuf(@chars, 1); END; FUNCTION XMitString; VAR count : LongInt; BEGIN count := length(str); XMitString := FSWrite(ModemOutputRefNum, count, Pointer(ord4(@Str) + 1)); END; FUNCTION XMitCRLF; VAR chars : Integer; count : LongInt; err : OSErr; BEGIN chars := $0D0A; count := 2; err := FSWrite(ModemOutputRefNum, count, @chars); {send "chars", all two bytes of it} XMitCRLF := err; END; FUNCTION XMitInt; BEGIN xMitInt := XMitBuf(@i, 2); END; FUNCTION XMitLong; BEGIN XmitLong := XMitBuf(@l, 4); END; FUNCTION XMitLine; VAR count : LongInt; BEGIN count := length(str); XMitLine := FSWrite(ModemOutputRefNum, count, Pointer(ord4(@Str) + 1)); xMitLine := XMitCRLF; END; FUNCTION RecvBuf; BEGIN RecvBuf := FSRead(ModemInputRefNum, len, buf); END; FUNCTION RecvChar; VAR chars : PACKED ARRAY[0..1] OF char; count : LongInt; BEGIN count := 1; RecvChar := FSRead(ModemInputRefNum, count, @chars); c := chars[0]; END; FUNCTION RecvFixedString; VAR count : LongInt; BEGIN count := len; RecvFixedString := FSRead(ModemInputRefNum, count, Pointer(ord4(@str) + 1)); str[0] := chr(LoWord(count)); END; FUNCTION RecvString; VAR len : LongInt; err : OSErr; BEGIN err := SerGetBuf(ModemInputRefNum, len); RecvString := FSRead(ModemInputRefNum, len, Pointer(ord4(@str) + 1)); str[0] := chr(LoWord(len)); END; PROCEDURE Wait; VAR time : LongInt; BEGIN Time := TickCount; WHILE (tickCount - time) < ticks DO ; END; END. **The opinions stated herein are my own opinions and do not necessarily represent the policies or opinions of my employer (THINK Technologies, Inc). Richard M. Siegel Customer Support Representative THINK Technologies, Inc. Uucp: {decvax, ucbvax, sun}!harvard!endor!singer Internet/Arpanet: singer@harvard.harvard.edu No one writes programs that work right the first time. If they did, I'd be out of a job.