如何减慢将文本粘贴到串行终端的速度?

如何减慢将文本粘贴到串行终端的速度?

我正在研究树莓派,并尝试将一些文本文件粘贴到命令行文本编辑器中nano......但文本最终在远程端损坏(部分/不完整的文本)。我只能猜测我的PC(xubuntu 16.04)的粘贴功能推送数据太快(串行波特率是115200)。

我可以以某种方式减慢粘贴功能吗?

答案1

我发现screen有慢粘贴功能! https://gist.github.com/jandahl/8436cd6a99d56efd9ff4

  1. 安装屏幕

  2. 如果没有 .screenrc 文件,请创建一个:


startup_message off

hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'

defslowpaste 20 ## It is the value to the left that is the central one for your happiness
  • 如果您已经有,.screenrc则只需添加最后一行: defslowpaste 20

  1. 使用适当的串行端口启动屏幕(树莓派,第一代,默认为 115200 波特): screen /dev/ttyUSB3 115200

  2. 玩得开心!

答案2

我只能猜测我的PC(xubuntu 16.04)的粘贴功能推送数据太快(串行波特率是115200)。

这个假设是错误的。终端驱动程序将始终使用配置的波特率写入其输出队列中的数据,并且write(2)到终端的 a 将返回一个短计数,或者如果输出队列中没有更多空间则阻塞(或者不是阻塞,而是返回-1 并设置errnoEAGAIN(如果终端设置为非阻塞模式)。串行驱动程序不会“调整”波特率以适应它必须推送的数据量。

您可以轻松测试是否有两台可以通过串行线连接的机器(或者您可以将同一台机器连接到自身,例如2个USB->串行适配器,通过零调制解调器电缆连接的两个串行端口等)。

例如。如果/dev/ttyUSB0机器 A 连接到/dev/ttyUSB1机器 B:

在机器A上:

# stty -F /dev/ttyUSB0 speed 50 raw; cat /dev/ttyUSB0

在机器B上:

stty -F /dev/ttyUSB1 speed 50 raw opost onlcr; cat >/dev/ttyUSB1
<paste>

现在,在机器 上的命令行中粘贴一些大文本B,并看到它在机器 上以每秒约 5 个字符的速度流畅地向下流动A

真正的问题是,程序编写者忽略了退出状态,write(2)或者假设虽然它可以返回错误,但它永远不会返回少于所需的计数。解决方案是修复或停止使用他们的垃圾,而不是使用既不可靠又不太有效的创可贴。

另外,如果电缆/连接不良/有噪音,您将不得不降低波特率,否则数据将变成二进制垃圾,并且某些串行适配器可能会硬锁定并必须重置。

如果其中一台设备无法应对其标称波特率,并且不支持任何类型的硬件或软件流控制(xon/xoff),则也应降低波特率。

相关内容