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
|