シリアル端末にテキストを貼り付ける速度を遅くする方法は?

シリアル端末にテキストを貼り付ける速度を遅くする方法は?

私はRaspberry Piで作業しており、いくつかのテキストファイルをコマンドラインテキストエディタに貼り付けようとしています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. 適切なシリアルポートを使用したブート画面(Raspberry Pi、第1世代、デフォルトは115200ボード): screen /dev/ttyUSB3 115200

  2. 楽しくお過ごしください!

答え2

私のPC(xubuntu 16.04)の貼り付け機能がデータをすばやくプッシュしていると推測できます(シリアル転送速度は115200です)。

この仮定は間違っています。ターミナルドライバは常に設定された転送速度を使用して出力キューにデータを書き込み、出力キューにスペースがなくなるとターミナルのwrite(2)短いカウントまたはブロックを返します(またはブロックの代わりに-1を返して設定します)。 (ターミナルが非ブロックモードに設定されているerrno場合EAGAIN)シリアルドライバは、プッシュする必要があるデータ量に応じて転送速度を「調整」しません。

シリアルラインを介して接続できる2台のコンピュータがあるかどうかを簡単にテストできます(または同じコンピュータをそれ自体に接続できます(たとえば、USB - >シリアルアダプタ2台、ヌルモデムケーブルを介して接続された2つのシリアルポートなど)。 .).

例えば。マシンAがマシンB/dev/ttyUSB0に接続されている場合:/dev/ttyUSB1

マシン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)たりエラーを返したりすることができますが、必要な数より少ない数は返さないと仮定することです。解決策は、信頼できず、効果的でない絆創膏を使用するよりも、ゴミの使用を修正または中断することです。

また、ケーブル/接続が悪い場合や騒音が激しい場合は、伝送速度を下げる必要があります。そうしないと、データがバイナリごみになり、シリアルアダプターの一部がハードロックされ、リセットする必要があります。

デバイスの1つが公称転送速度を処理できず、どの種類のハードウェアまたはソフトウェアフロー制御(xon / xoff)もサポートしていない場合は、転送速度を下げる必要があります。

関連情報