stokes%cmc.cdn%ubc.CSNET@RELAY.CS.NET (Peter Stokes) (01/08/87)
Hello, Does anybody have a piece of code (MACRO, FORTRAN, C or other) to manually raise and drop DTR on a terminal port? The port can either be a DZ-11 or DMF32 device and DTR will be low by default (SYSGEN parameter TTY_DIALTYPE bit 1 set to 1). It does not matter if the port is set to MODEM or NOMODEM when this code is run. I know I should probably make use of the IO$_MAINT function modifier but none on the stuff on page 8.4.3.3 of the I/O Users Guide Part One makes any sense to me... Help! Thanks, Peter Canadian Microelectronics Corporation Envoy100: cmc.vlsiic CDNnet: stokes@cmc.cdn BITNET: stokes@qucdncmc.bitnet
McGuire_Ed@GRINNELL.MAILNET (01/08/87)
You're right, the documentation on modem control is lousy. I went through what you are going through last year. CSC was some help, and they eventually submitted an SPR on my behalf suggesting changes and improvements to the documentation. Rather than try to explain the whole process (and probably get some of it wrong because it's been awhile), I'm including an example of code that toggles DTE modem control signals on a DMZ-32, and then tests the modem's DCE signals in order to determine whether the right thing happened. I'm assuming that if you were This code is extracted from a program I developed in BASIC (permission granted to stare in disbelief) which supports autodial from a VAX/VMS system, including security features such as restricted access to specific remote services by username. Cooincidentally, I have just been asked to make some enhancements to the program. This means that I will be refamiliarizing myself with the operation of all this stuff, and you're welcome to ask specific questions if you think there is a chance I might be of some help. Ed McGuire McGuire_Ed%GRINNELL.MAILNET@MULTICS.MIT.EDU (MIT-MULTICS.ARPA) ******************************************************************************** Code fragment which declares some structures necessary for example ******************************************************************************** option type=explicit record quad variant case byte byte0, byte1, byte2, byte3, byte4, byte5, byte6, byte7 case word word0, word2, word4, word6 case long long0, long4 end variant end record quad external long constant & dia_notidle external long constant & tt$m_ds_carrier, & tt$m_ds_cts, & tt$m_ds_dsr, & tt$m_ds_dtr, & tt$m_ds_ring, & tt$m_ds_rts, & tt$m_ds_secrec, & tt$m_ds_sectx external sub & lib$signal common & quad sensemode_block, & setmode_block ******************************************************************************** Fragment of code which clears RTS, DTR, and SECTX, then tests DSR, RING, CARRIER, and SECREC. ******************************************************************************** idle_modem: ! DROP ALL MODEM SIGNALS setmode_block::word0 = 0% setmode_block::byte2 = 0% setmode_block::byte3 = tt$m_ds_rts or tt$m_ds_dtr or tt$m_ds_sectx setmode_block::long4 = 0% call set_modem ! WAIT FOR A MOMENT call timed_wait ("0 0:00:00.10") ! READ MODEM SIGNALS TO BE SURE IT'S IDLE call sense_modem call lib$signal by value (dia_notidle) if sensemode_block::byte2 and & (tt$m_ds_dsr or tt$m_ds_ring or tt$m_ds_carrier or tt$m_ds_secrec) return ******************************************************************************** Fragment of code which raises DTR and RTS. ******************************************************************************** dial_remote: ! RAISE DTR AND RTS setmode_block::word0 = 0% setmode_block::byte2 = tt$m_ds_rts or tt$m_ds_dtr setmode_block::byte3 = 0% setmode_block::long4 = 0% call set_modem ******************************************************************************** Subroutines SET_MODEM and SENSE_MODEM, which set signals according to the values stored in SETMODE_BLOCK ******************************************************************************** sub set_modem !---------------------------------------------------------------------- ! DECLARATIONS !---------------------------------------------------------------------- %include 'common' ! LOCAL STORAGE declare & long & s !---------------------------------------------------------------------- ! MAIN CODE !---------------------------------------------------------------------- s = sys$qiow (!efn!, modem_chan, io$_setmode or io$m_set_modem or & io$m_maint, x_iosb, !astadr!, !astprm!, loc (setmode_block), !p2!, & !p3!, !p4!, !p5!, !p6!) call lib$signal by value (dia_bugcheck, 1%, "Set_Modem" by desc, & dia_bugsta, 1%, "$QIOW" by desc, s) unless s and 1% call lib$signal by value (dia_bugcheck, 1%, "Set_Modem" by desc, & dia_bugsta, 1%, "$QIOW" by desc, x_iosb::s) unless x_iosb::s and 1% end sub 1 !---------------------------------------------------------------------- ! SENSE_MODEM.BAS SENSE MODEM CONTROL SIGNALS 26-FEB-1986 ! ! Edward K. McGuire ! Grinnell College ! Grinnell, IA 50112 ! ! DESCRIPTION ! This routine senses the state of the modem control signals. ! ! IMPLICIT INPUTS ! modem_chan Channel assigned to modem ! SIDE EFFECTS ! sensemode_block Overwritten by new modem control signal states ! !---------------------------------------------------------------------- sub sense_modem !---------------------------------------------------------------------- ! DECLARATIONS !---------------------------------------------------------------------- %include 'common' ! LOCAL STORAGE declare & long & s, & iosb & sense_iosb !---------------------------------------------------------------------- ! CODE SECTION !---------------------------------------------------------------------- s = sys$qiow (!efn!, modem_chan, io$_sensemode or io$m_rd_modem, & sense_iosb, !astadr!, !astprm!, loc (sensemode_block), !p2!, & !p3!, !p4!, !p5!, !p6!) call lib$signal by value (dia_bugcheck, 1%, "SENSE_MODEM" by desc, & dia_bugsta, 1%, "$QIOW" by desc, s) unless s and 1% call lib$signal by value (dia_bugcheck, 1%, "SENSE_MODEM" by desc, & dia_bugsta, 1%, "$QIOW" by desc, sense_iosb::s) unless sense_iosb::s & and 1% %if %debug %then print "[Modem signals:"; print " DSR"; if sensemode_block::byte2 and tt$m_ds_dsr print " RING"; if sensemode_block::byte2 and tt$m_ds_ring print " CARRIER"; if sensemode_block::byte2 and tt$m_ds_carrier print " CTS"; if sensemode_block::byte2 and tt$m_ds_cts print " SECREC"; if sensemode_block::byte2 and tt$m_ds_secrec print "]" %end %if end sub ******************************************************************************** End of example ********************************************************************************
yerazuws@CSV.RPI.EDU.UUCP (01/09/87)
In article <1314*stokes@cmc.cdn>, stokes%cmc.cdn%ubc.CSNET@RELAY.CS.NET (Peter Stokes) writes: > Hello, > > Does anybody have a piece of code (MACRO, FORTRAN, C or other) to > manually raise and drop DTR on a terminal port? I have an application which (from a command file) must raise and lower DTR several times (to get the attention of the modem, insure the phone line disconnects, etc.). SET TERM /MODEM/PERM and SET TERM /NOMODEM/PERM raise and lower DTR respectively. Note that another process can do this while one process is running (but this needs privs). This is VMS 4.4 on an AI VAXstation (uVAX II), with a DHV-11. The DMF32 device driver should respond similarly. -Bill Yerazunis