1 分钟阅读 次阅读

问题描述

开发串口工具时,发现当输入的命令过长时,对应的Linux终端会返回很多方框,查看原始数据发现是退格符\b,导致数据解析混乱。

原因

一般情况下,终端的列宽默认配置是80,如果超过此长度,终端为了显示正常,会先输出回车,让光标回到行首,然后打印<,提示用户命令显示被截断,左侧还有内容,接着输出剩下的内容,然后还会打印一些空白字符覆盖后面的那一段。

1. 原始通信日志

这个通信日志将不同含义的段拆成几行了,实际是连续输出的:

[17:03:20.293] Recv 64 6D 65 73 67 7C 67 72 65 70 20 2D 69 45 20 22 65 72 72 6F 72 7C 66 61 69 6C 22 7C 67 72 65 70 20 2D 76 45 20 22 45 72 72 6F 72 5F 52 65 63 6F 76 65 72 79 7C 63 72 6F 73 2D 65 63 2D 72 74 63 7C 6F 66 5F 69 72 71

0D

3C

65 70 20 2D 76 45 20 22 45 72 72 6F 72 5F 52 65 63 6F 76 65 72 79 7C 63 72 6F 73 2D 65 63 2D 72 74 63 7C 6F 66 5F 69 72 71 7C 64 70 75 5F 70 61 72 73 22

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08

0D 0A

2. 报文解析与原理 观察上述十六进制日志的后半段,可以明显看到系统 Shell(通常是 Busybox ash)触发的单行滚动重绘动作:

  • 0D:即回车(\r),将光标移回当前行的行首。
  • 3C:即 < 符号,Shell 用来提示用户左侧还有被隐藏或折叠的字符。
  • 65 70 20 2D 76 45...:开始打印命令被截断的后半部分(对应 ASCII 码 ep -vE "Error_Recovery...)。
  • 随后打印了 21 个空格(十六进制 20 20...),用来覆盖清除当前行之前残余的旧字符。
  • 最后跟着连续 21 个退格符(十六进制 08 08...),把光标重新平移回命令的末尾处等待下一次输入。

解决方式

可以先查看下当前终端的列宽:

stty size

设置列宽为1024:

stty cols 1024

只要列宽大于输入的命令长度,就不会触发终端截断的行为。

留下评论