我正在研究树莓派,并尝试将一些文本文件粘贴到命令行文本编辑器中nano
......但文本最终在远程端损坏(部分/不完整的文本)。我只能猜测我的PC(xubuntu 16.04)的粘贴功能推送数据太快(串行波特率是115200)。
我可以以某种方式减慢粘贴功能吗?
答案1
我发现screen
有慢粘贴功能!
https://gist.github.com/jandahl/8436cd6a99d56efd9ff4
安装屏幕
如果没有 .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
使用适当的串行端口启动屏幕(树莓派,第一代,默认为 115200 波特):
screen /dev/ttyUSB3 115200
玩得开心!
答案2
我只能猜测我的PC(xubuntu 16.04)的粘贴功能推送数据太快(串行波特率是115200)。
这个假设是错误的。终端驱动程序将始终使用配置的波特率写入其输出队列中的数据,并且write(2)
到终端的 a 将返回一个短计数,或者如果输出队列中没有更多空间则阻塞(或者不是阻塞,而是返回-1 并设置errno
为EAGAIN
(如果终端设置为非阻塞模式)。串行驱动程序不会“调整”波特率以适应它必须推送的数据量。
您可以轻松测试是否有两台可以通过串行线连接的机器(或者您可以将同一台机器连接到自身,例如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),则也应降低波特率。