我有一个 stm32f1 控制的设备,它使用 USART/USB 端口来实现用户控制接口。使用标准终端软件(putty/minicom),用户能够在设备外壳中输入简单的命令。
有一个问题。如果传入的信息包较多,它们会通过 shell 提示符进行打印,从而使输入新命令变得困难。
我计划将终端屏幕分为两个区域:单行提示和传入数据包的可滚动区域。
我尝试使用以下转义序列:
162 72 r * DECSTBM - Set top and bottom margins (scroll region on VT100)
[4;20r = Set top margin at line 4 and bottom at line 20
但仍然找不到一个好的教程来描述正确的方法来帮助我解决我的问题。
答案1
阅读源代码很有帮助,但建议的示例很复杂。大多数有用的程序(例如 OP)都会通过 termcap 或curses 接口询问使用转义序列。如果用诅咒来做的话会简单得多。以下是使用 termcap 所需的步骤:
- 获取终端描述(包括光标移动、滚动区域、擦除行、索引)
- 将终端初始化为“cbreak”(半原始)模式以允许保留提示在一行。
- 将光标移动到应该出现提示的行
- 擦掉线
- 写出提示
- 获取输入命令
同时(对数据包的引用表明OP希望在读取输入的同时显示它们)
- 将光标移动到滚动区域的底行
- 设置滚动区域
- 写一行包(以换行符结尾,或使用指数转义序列)
- 将滚动区域重置为默认值(全屏)
- 将光标移回命令行,继续阅读命令
最佳实践不会尝试在滚动区域之外使用光标寻址,因此每次程序在屏幕的两个部分之间切换时,都会对滚动区域进行大量设置/重置。
进一步阅读:
- 分屏平滑滚动排列(1986 年 12 月)
- 使用 VT100 转义码(1996)
- 分屏模式会产生多少流量?(2004)
答案2
(假设您希望提示符位于底部,并且窗口高度为 25 行。)
基础知识是:配置设备的 shell 以在从用户接受命令后设置滚动区域(相当于printf "\033[1,24r"
) - 并在完成后重置它 - printf "\033[r"
。