▼ 前書き ▼ XMODEMを使えるようになると、PC上にマイコンのモーションデータや初期設定のデータ等を保存できるようになります。ハイパーターミナルや、TERATERMを使われている方は、画面上から文字を打ち込んでモーションを作っているのではないでしょうか? EEPROMがあるならば保存できますが、ない場合は毎回プログラム中にデータを保存して、コンパイルして焼きこんで・・・という手続きがあり、面倒です。少なくとも、私はそう感じました。 そこで、私もようやくEEPROMを扱えるようになったので、XMODEMを使ってデータの吸出しと、転送を行えるようにしようとWEB上を探索し、使い方を知る事ができました。今回は、XMODEMをどのような手続きを行えば、マイコンと通信できるのかを紹介します。
XMODEMはパソコン通信を行うために使われていた通信方法の一つ。非常に簡単な設定でバイナリデータの転送ができたので、たくさんのコンピュータやソフトでも実装されている。しかし、多くの問題点も抱えているらしい。 他にも、YMODEMやZMODEM等もあるが、とりあえず必要なさそうなので、XMODEMを実装することにした。(今後、変えたほうが良さそうならば、また調べるかもしれません。) |
▼ ブロックの構造 ▼
XMODEMは、データを「ブロックと呼ばれる単位」で送信します。そのブロックの構造を図1-1に示します。
SOH(Start Of Headingの略)は制御文字で、ASCIIコードで言うと0x01になります。これを、受信したら「ここから1ブロックが始まる」と分かる訳です。 BN(Block Numberの略)は、ブロック番号です。(そのまんまですね)最初0x01から始まり、0xFFになると0x00にリセットされて、またカウントされていきます。 BNCは、ブロック番号の1の補数です。早い話が、ブロック番号を反転させた数字です。0x01なら0xFE、0x15なら0xEAになります。これはエラーチェックに使われます。 DATAの部分で、128バイトのデータを送信することができます。txtに書かれている128個のキャラクタ文字を、始めの方から順番に送信し、128個分送るまで止まりません。もしも、100個まで |
しかデータがなく、その後が空であった場合は、足りない分を「Control-Z(0x1A)」で埋めます。 CheckSumは、先程送ったータ部分を全て足して256で割った数の余りです。これもエラーチェック用です。 以上で、1ブロックの説明を終わります。 ▼ 通信の手順 ▼
それでは、いよいよXMODEMの転送手順を説明していきます。データ転送の手順を以下に示します。
|
STEP1: 受信側はNAKを送信して、SOHが送られてくるのを待ちます。一定時間待ってもSOHが送られてこない場合は、再度NAKを送ります。
STEP2: 送信側はNAKを受け取ったら、SOHからチェックサムまでのデータを連続で送信します。受信側は、ひたすら受信し続けます。 STEP3: 送信側は、チェックサムまで送り終わったら、エラーチェックの結果が送信されてくるのを待ちます。 受信側はエラーチェックを開始します。まず、BNとBNCを足し合わせ、合計が0xFFになればエラーはありません。 次にチェックサムのエラーチェックに入ります。前に、全てのデータを足して256で割った余りだと言いましたが、実際はcharのレジスタに足していくだけでOKです。 つまり、0をASCIIコードに変換すれば「0x30」になります。これを足していくと、255でオーバーフローして、また0からスタートします。 これを128回やった結果が、チェックサムと同じなら、エラーは起こっていないことになります。 プログラムにすると以下のような感じになります。 unsigned char x = 0; char i, data[128]; /* dataは、受信したデータ*/ for(i=0;i<128;i++) x = x + data[i]; |
もし、データに0xFFなどのおかしいデータが混ざっていれば、チェックサムは同じにならないのでエラーだと分かります。
STEP4: もしもOKならばACKを送信し、次のブロックが送信されてくるのを待ちます。エラーがあればNAKを送信し、今送られてきた内容をもう一度送るようにします。 STEP5: もしも、次のブロックがなく終了である場合は、ACKを送信側が受け取ると、EOTを送信します。受信側はEOTを受け取ったら、ACKをもう一度送信し、通信を終了します。 最後に、制御文字を表にまとめておきます。
以上で通信方法の説明を終わります。 ▼ TERATERM PRO ▼ 今回、エラーチェック方式はCheckSumを用いた方法でした。この他にもCRCというエラーチェック方式があります。 |
パソコンに初期からインストールされているハイパーターミナルだと、エラーチェックがデフォルトでCRC方式になっているので、ちゃんと通信できません。
TERATERM PROならば、エラーチェックの方法を選ぶ事ができるので、今回のCheckSumを用いた方法で通信することができます。 しかし、問題が一つあります。それは送信開始を要求する「NAK」の送信です。通信の説明の所で、SOHが送られてこなかったら「NAKを再度送信する。」とあったと思います。 この再度送信する時間が早すぎると、TERATERM PROでは正常に動作せず、ずっとエラーが出てしまいます。NAKを再送信する時間は5秒以上あると、成功します 5秒は結構長めに取っているので、何度か調整されたらもうもう少し早くても大丈夫だと思います。 ▼ 注意点 ▼ もしも、txtにある文字が128文字で割り切れない場合は、残りの空の部分がControl-Z、即ち制御文字で言う所のSUB(0x1A)で埋められてしまうので、注意してください。 例えば、最後の2文字が足りない場合は、0x1A 0x1Aと送信されます。マイコン側でこれらを処理しておかないと、後々厄介な事になる事が考えられるので注意しましょう。 |
▼ 最後に... ▼ 今回はXMODEMについて調べた事をまとめてみただけなので、分かり難い部分が多々あると思います。もしも分からない部分、間違っている、等がありましたら掲示板にて申し出てください。 私も完璧に理解している・・・とは言えないので、少しずつ分かりやすい文章にしていけるように頑張ります。
|
参考文献&参考URL
Googleにて検索 検索ワード 1の補数 ・「笑顔をあなたにも、悲しみをわたしにも」 ⇒ IP のチェックサム -- 1の補数演算 検索ワード XMODEM データブロック ACK ・モーバイルコンピューティングにおける エージェントの開発 ⇒ 第4章 プロトタイプの設計 ・Phinloda is here. ⇒ Part2 通信プロトコルの仕様 検索ワード Control Z 16進数 ・HP テクニカル ドキュメント ⇒ ascii |
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||