文章
· 十二月 13, 2024 阅读大约需 3 分钟

第四十九章 终端输入 输出 - 转义序列编程

第四十九章 终端输入 输出 - 转义序列编程

转义序列编程

转义序列的 ANSI 标准使智能终端的编程变得实用。字符串中转义字符及其后面的所有字符不会显示在屏幕上,但会更新$X$Y 。使用WRITE *语句将转义序列发送到终端,并通过直接设置$X和$Y来保持它们最新。

ANSI 标准建立了转义序列的标准语法。特定转义序列的效果取决于使用的终端类型。

每次READ之后在$ZB中查找传入的转义序列。 IRISANSI 标准转义序列和任何其他使用 ANSI 形式的转义序列放入$ZB中。 IRIS 可识别两种形式的转义序列:

常规形式

  • An ESC.
  • 可选字符“O”(字母),十进制值 79
  • 零个或多个十进制值为 32–47 的字符。
  • 十进制值 48–126 的一个字符。

控制形式

  • ESC字符,十进制值 27
  • “[”字符,十进制值 91
  • 零个或多个十进制值为 48–63 的字符。
  • 零个或多个十进制值为 32–47 的字符。
  • 十进制值 64–126 的一个字符。

此外,序列不能超过 16 个字符。违反这些形式或规则的转义序列设置$ZA的位 8,其值为 256

示例

假设正在对一个终端进行编程,其帮助键发送两个字符序列Escape-? ( ?的十进制值为 63

%SYS>SET HELP=$C(27,63)
ASK READ !,"Enter ID: ",X I $ZB=HELP Do GIVEHELP GoTo ASK

例程可以检测非标准转义序列,如下所示:

  1. ESC成为terminator
  2. 当ESC出现在$ZB中时:
    1. 使用 Secret 协议禁用 echo 以防止修改 $X/$Y
    2. 使用READ *读取序列的其余部分;
    3. 关闭 Secret 以重新启用 echo

在下图中,要求用户输入 ID。如果用户按Esc-? ,出现帮助屏幕。子例程ESCSEQ假定非标准转义序列以星号“*”结尾。

DEMOS 
  SET HELP=$C(27,63) ;Get Help with <ESC>?
    SET ESC=$C(27) USE 0:("":"":ESC) ; Make <ESC> a READ terminator
                                     ; character
ASK READ !,"Enter ID: ",X I $ZB=ESC Do ESCSEQ G:SEQ=HELP ASK 
    . ;Input ID. Handle Help request. 
    .
    Quit
HELPSCR  ;Process Help request 
    . 
    Quit
ESCSEQ  USE 0:("":"S") SET SEQ=ESC ;Set terminal to no echo,init SEQ 
    FOR I=1:1 {
      READ *Y 
      SET SEQ=SEQ_$C(Y)
      QUIT:Y=42 }
    ; Read in Escape sequence, 
    ; end at "*" 
    USE 0:("":"":ESC) Quit ;Redefine terminator

IRIS 支持计算机间链接和特殊设备

IRIS 提供灵活的协议和大型独立缓冲区,使例程能够处理异常设备及其协议。例如, IRIS 可以轻松支持终端到终端链路上两台计算机之间的全双工通信。两个 IRIS 系统仅需要物理连接、正确的协议以及相同的速度、奇偶校验和字符长度设置。借助外部转换器, IRIS 作为同步 EBCDIC 终端与 IBM 端口进行通信。

设计计算机间链路时请记住以下几点:

  • 通过在OPENUSE中包含 S 协议,或者使用操作系统的终端参数来关闭两端的回显。
  • 除非通信协议支持 XON/XOFF 流量控制( Ctrl-QCtrl-S ),否则请确保它将未确认的传输限制在操作系统输入缓冲的限制内;否则可能会丢失数据。
  • 在图像模式下, IRIS 不支持 XON/XOFF。在非图像(正常)模式下,操作系统的终端参数决定如果操作系统的输入缓冲区几乎已满,计算机是否发出 XOFF。如果不支持 XOFFXON,请将缓冲区设置得足够大,以便不需要它们。
  • 读取操作后测试$ZA以检测传输错误,例如奇偶校验或数据溢出情况。
讨论 (0)1
登录或注册以继续