HP OpenVMS Systemsask the wizard |
The Question is:
I use a modem connected on a serial port.
I try to change length buffer from 7 to 8, and parity from even to none, using
IO$_SETCHAR command.
The programmation language is Fortran.
Length buffer change works correctly, but parity change is unsuccessfull.
Can you tell me if the following program is correct, specially for changing
parity ?
STRUCTURE /Characteristics/
INTEGER*1 Class,Type
INTEGER*2 Width
INTEGER*4 Basic
END STRUCTURE
RECORD /Characteristics/ CharBuf
INTEGER*2 Channel
INTEGER*4 IO_Function,Io_Parity
REAL*8 Iost_q
IO_Function = %LOC(IO$_SENSECHAR)
Sta = SYS$QIOW(,%VAL(Channel ),%VAL(IO_Function)
1, %REF(iost_q),,,CharBuf,%VAL(8),,,,)
CharBuf.Basic = IBSET(CharBuf.Basic,%LOC(TT$V_EIGHTBIT))
c translation in fortran of the instruction given in IO User's Reference c
Manuel, Section 5.4.3, "insv iosb+6, #4, #8, flags", supposing "iosb" is c
the address of the buffer issued c from IO$_SENSECHAR command
CALL MVBITS(CharBuf.Basic,20,8,Io_Parity,0)
IO_Parity = IBCLR(IO_Parity,%LOC(TT$V_PARITY))
IO_Function = %LOC(IO$_SETCHAR)
Sta = SYS$QIOW(,%VAL(Channel ),%VAL(IO_Function)
1, REF(iost_q),,,%REF(Charbuf),%VAL(8),,,%VAL(IO_Parity),)
To perform the reverse change, the program is the same except :
CharBuf.Basic = IBCLR(CharBuf.Basic,%LOC(TT$V_EIGHTBIT))
IO_Parity = IBSET(IO_Parity,%LOC(TT$V_PARITY))
Thanks you for your help.
The Answer is :
PROGRAM:
c COPYRIGHT (C) 1996 BY
c DIGITAL EQUIPMENT CORPORATION, MAYNARD
c MASSACHUSETTS. ALL RIGHTS RESERVED.
c THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
c ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSION
c OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES
c THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER
c PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.
c THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
c SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
c DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
c SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
c NO RESPONSIBILITY IS ASSUMED FOR THE USE OR RELIABILITY OF SOFTWARE
c ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL EQUIPMENT CORPORATION.
c SUPPORT FOR THIS SOFTWARE IS NOT COVERED UNDER ANY DIGITAL SOFTWARE
c PRODUCT SUPPORT CONTRACT, BUT MAY BE PROVIDED UNDER THE TERMS OF THE
c CONSULTING AGREEMENT UNDER WHICH THIS SOFTWARE WAS DEVELOPED.
c To demonstrate this program at your terminal, set the parity of
c the current terminal port to NONE, like this:
c $ SET TERMINAL/PARITY=NONE
c and enter
c $ SHOW TERMINAL
c to verify that your parity is set to NONE. Next run this
c program, and enter
c $ SHOW TERMINAL
c again to verify that the terminal is set to ODD parity. You
c may then reset your terminal to the parity that you normally
c run at.
c NOTE: Setting the terminal parity is NOT supported by LAT terminals.
program set_par
implicit none
structure / iosb_struct / ! IOSB data structure
integer*2 status
byte transmit_speed
byte receive_speed
byte cr_fill_count
byte lf_fill_count
byte parity_flags
byte always_zero
end structure
structure / term_char_struct / ! Terminal Characteristics
byte class
byte type
integer*2 buffer_size
byte basic_term_char(3)
byte page_length
integer*4 extended
end structure
integer*4 set_parity, istat, qio_chan, sys$assign,
1 sys$qiow, lib$stop
record / iosb_struct / iosb
record / term_char_struct / term_char
include '($iodef)'
include '($ttdef)'
c Get the QIO channel number
istat=sys$assign('tt',qio_chan,,)
if (.not. istat) call lib$stop(%val(istat))
c Get the current terminal characteristics using a
c SENSEMODE QIOW
istat=sys$qiow(,%val(qio_chan),%val(io$_sensemode),iosb,
* ,,term_char,%val(12),,,,)
if (.not. istat) call lib$stop (%val(istat))
c Display the current parity flags
write (6,50)iosb.parity_flags
50 format(' Current parity of terminal:',z3,' (HEX)')
type *
c Set the SET_PARITY variable to indicate that you desire
c to set the parity of the current terminal to ODD.
set_parity = (tt$m_altrpar .or. tt$m_odd .or. tt$m_parity)
c Do a SETMODE QIOW to set the terminal to ODD parity
c as indicated by the P5 parameter of the QIOW.
istat=sys$qiow(,%val(qio_chan),%val(io$_setmode),,
* ,,term_char,%val(12),,,%val(set_parity),)
if (.not. istat) call lib$stop (%val(istat))
c Get the terminal characteristics again.
istat=sys$qiow(,%val(qio_chan),%val(io$_sensemode),iosb,
* ,,term_char,%val(12),,,,)
if (.not. istat) call lib$stop (%val(istat))
c Print out the present terminal characteristics.
type *,'The following IOSB values are all in HEXADECIMAL:'
type *
write(6,10)' iosb - status: ',iosb.status
write(6,10)' iosb - transmit speed: ',iosb.transmit_speed
write(6,10)' iosb - receive speed: ',iosb.receive_speed
write(6,10)' iosb - CR fill count: ',iosb.cr_fill_count
write(6,10)' iosb - LF fill count: ',iosb.lf_fill_count
write(6,10)' iosb - parity flags: ',iosb.parity_flags
write(6,10)' iosb - always zero: ',iosb.always_zero
type *
type *,'The following TERMINAL CHARACTERISTICS are all in',
* ' HEXADECIMAL, except for'
type *,' BUFFER SIZE and PAGE LENGTH, which are in DECIMAL:'
type *
write(6,10)' term char - class: ',term_char.class
write(6,10)' term char - type: ',term_char.type
write(6,20)' term char - buffer size:',term_char.buffer_size
write(6,40)' term char - basic term: ',
* term_char.basic_term_char(1),
* term_char.basic_term_char(2),
* term_char.basic_term_char(3)
write(6,20)' term char - page length:',term_char.page_length
write(6,30)' term char - extended: ',term_char.extended
10 format (a,' ',z2.2)
20 format (a,' ',i4.4)
30 format (a,' ',z8.8)
40 format (a,' ',z2.2,z2.2,z2.2)
end
|