Thread View: mod.computers.vax
1 messages
1 total messages
Started by TWADE
Fri, 10 Apr 1987 19:16
Detecting Baud rate.
Author: TWADE
Date: Fri, 10 Apr 1987 19:16
Date: Fri, 10 Apr 1987 19:16
94 lines
4471 bytes
4471 bytes
> Is there any system service (I think not) or other technique
>that I can use to determine the baud rate for a process' controlling
>terminal? I have a need for such code. It would be preferable to
>allow a suitably privileged program to determine it based on PID, but
>it would also be feasible to use code that determined this only for
>the current job. (NO, SHO TERMINAL to a file and parsing the result
>is NOT suitable.)
Here is a routine that I ripped out of a program, and turned into a
callable procedure. It will return the transmit and receive speeds for
the process's own controlling terminal. The codes are defined by the $TTDEF
macro as TT$C_BAUD_300, TT$C_BAUD_9600 etc. I am not sure how many there
are, but that isn't difficult to find out. The calling sequence is
success = GET_SPEED (t_speed, r_speed)
Both args are longwords passed by reference.
--------------- SPEED.MAR -------X Cut here X----------------------------
.Title GET_TTY_SPEED
; This procedure returns the speed of the process's controlling terminal.
; It returns SS$_NORMAL for success, or any error code from $ASSIGN, $DASSGN
; or $QIOW if failed.
;
; The actual speeds are returned in the I/O status block when a SENSEMODE
; QIO if performed (p 8-49, IO User Guide part 1). I notice that the
; documentation states that the receive speed is only returned if different
; from the transmit, but when I tried it I got both fields set to 10 Hex
; (19200 baud). Parity flags are also returned, though this routine ignores
; them.
$TTDEF
Ttchan: .Long 0 ; channel
Ttdev: .Ascid "SYS$COMMAND"
Iosb: ; I/O Status Block.
Status: .Word 0 ; return status.
T_speed: .Byte 0 ; transmit speed.
R_speed: .Byte 0 ; receive speed.
Cr_fill: .Byte 0 ; CR characters inserted.
Lf_fill: .Byte 0 ; LF characters inserted.
Parity: .Byte 0 ; parity flags.
.Byte 0 ; unused.
.Entry GET_SPEED M <>
$ASSIGN_S -
chan = ttchan, -
devnam = ttdev
Blbs R0, 10$
Ret
10$: $QIOW_S -
chan = ttchan, -
func = #IO$_SENSEMODE, -
iosb = iosb, -
p1 = #0, - ; we are not interested
p2 = #0 ; in various mode settings.
Blbs R0, 20$
15$: Ret
20$: Movzwl status, R0 ; check status return.
Blbc R0, 15$
Movzbl t_speed, @4(AP) ; return transmit speed.
Tstb r_speed ; receive speed present?
Bneq 30$ ; yes - return it.
Movb t_speed, r_speed ; no - set it = transmit.
30$: Movzbl r_speed, @8(AP) ; return receive speed.
$DASSGN_S - ; Close the channel.
chan = ttchan
Blbc R0, 15$
Movzwl #SS$_NORMAL, R0 ; indicate success.
Ret
.End
----------- EOF SPEED.MAR -------X Cut Here X---------------------------------
As I say, I just hacked this together. It worked when I tried it on my
terminal, but the normal totally irresponsible disclaimers apply.
-------------------------------------------------------------------------
Tom Wade Internet: twade@csvax.ucd.hea.irl
Systems Programmer Ean: twade@csvax.ucd.irl
Dept Computer Science PSI: PSI%27243154000721::TWADE
University College Dublin Telex: (0500) 91196 UCD EI
Ireland. Voice: +353-1-693244 Ext 2472
-------------------------------------------------------------------------
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads