カテゴリー
IchigoJam

IchigoJamへのプログラム転送を高速化する(TeraTerm)

~お詫び~
この記事はTeraTerm側の送信バッファの動作の違いによる効果を、IchigoJamの受信バッファの違いによる効果であると勘違いして記載していました。
実験の内容や結果に相違はありませんが、私の勘違いによって誤解を与えるような表現がありました。TeraTerm限定であることを赤文字にて追記し、一部の表現を取り消し線で取り消しました。Facebookへの投稿メッセージ(https://www.facebook.com/groups/ichigojam/permalink/848499335289821/)については、はじめからTeraTerm限定の話のような書き方になっていましたが、投稿時の私に、そのような意図はなく、当ブログを読んで、実験をしてくださった皆様にご迷惑をおかけしました。
引き続き、有用な情報が提供できるよう、努力いたしますので、何卒、よろしくお願いいたします。
2017/1/3
国野 亘

TeraTermを使ってシリアル接続したIchigoJamへのプログラム転送時間を約半分にすることが出来ましたので、その方法について説明します。

※すべてのプログラム転送が早まるとは限りません。ご容赦ください。
※IchigoJamのファームウェアは1.2.1以降が必要です。
※TeraTermを使った場合の実験結果です。

シリアルの送信遅延を 9ミリ秒/字 250ミリ秒/行に設定する

結論から書くと、TeraTermの「設定」メニュー内の「シリアルポート」ウィンドウを開き、以下のように設定します。これで、(おそらく)通常の転送時間の半分で転送することが出来ると思います。

原理

IchigoJamのファームウェア1.2.1以降ではシリアルの受信バッファが128バイトに拡大されました。このバッファを活用することで処理時間を短縮させるのが目的です。
IchigoJamでは1文字の受信を行うのに約18msの処理時間が必要です。このため従来は18ms以上の送信遅延を設定していました。
一方で、IchigoJamのプログラムの1行の最大文字数は200文字です。つまりプログラムの1行の半分をバッファで処理することが出来るはずです。そこで、
ここでは、送信遅延を半分の9msに設定し、1行ごとに250msの遅延を設定することにしました。もし、予め1行の文字数が分かっているのであれば、1行ごとの250msの遅延についても、より短くすることが出来るでしょう。
ただし、この検証の後に、IchigoJam側が1/60秒ごとに1文字づつしか受信バッファの取り込みを行っていない可能性が高まっています。この場合、本検証による効果はTeraTermのみに限定されたものとなります。
以下は、貴重な参考情報です。

 - MicJackでは、文字遅延18ms、行遅延18msが最速(IchigoJam FANグループ尾野さん)
 - MicJackで、1度に100文字送った場合、行遅延で1600msが必要。つまり1文字あたり16msを要する。(同上)
 - Windows 10 VC++ コンソールアプリでは、文字遅延16ms、行遅延10msが高速(茶虎さん)
 - 記載していた結果の転送時間17.4秒は、1文字当たり17msであり、上記の結果を裏付けている

検証方法

以下のようなデータをTeraTermから転送して検証しました。始めにnewコマンドでプログラムを消去し、次にIchigoJam側の画面のカーソル位置を最下行に移動させます。そして、cltコマンドでタイマーをリセットし、1行あたり200文字のダミープログラムを5行分、入力し、最後に経過時間を表示します。
new
fori=1to25:?:next
clt
1 '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
2 '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
3 '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
4 '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
5 '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
?tick()

実行結果

1文字の送信遅延を、従来の18msにしたときと、9msにしたときの実行結果を比較しました。その結果、転送時間を約半分に短縮することが出来ました。
なお、実行後にはプログラムをPCに再転送し、相違がないことをdiffして確認済みです。
       文字遅延設定 行遅延設定  転送時間(結果)    効果
従来方式    18 ms      50 ms   tick=1925  32.1秒
提案方式     9 ms     250 ms   tick=1044  17.4秒  ▼ 46 %
前述のとおり、TeraTermの場合は、1行の文字数に合わせて行遅延設定を変更しても良いでしょう。
例えば、100文字以下の場合は50ms、100文字以降の場合は文字数をNとして、50+(N-100)×2 msとすれば、上手くゆきそうです(これは未検証です)。
なお、検証済みの方法も含めて、問題点があるかもしれません。自己責任で活用してください。
by ボクにもわかるIchigoJam用マイコンボード

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es