XMODEMをマイコンに実装する
通信方法の手順


▼ 前書き ▼

 XMODEMを使えるようになると、PC上にマイコンのモーションデータや初期設定のデータ等を保存できるようになります。ハイパーターミナルや、TERATERMを使われている方は、画面上から文字を打ち込んでモーションを作っているのではないでしょうか?

 EEPROMがあるならば保存できますが、ない場合は毎回プログラム中にデータを保存して、コンパイルして焼きこんで・・・という手続きがあり、面倒です。少なくとも、私はそう感じました。

 そこで、私もようやくEEPROMを扱えるようになったので、XMODEMを使ってデータの吸出しと、転送を行えるようにしようとWEB上を探索し、使い方を知る事ができました。今回は、XMODEMをどのような手続きを行えば、マイコンと通信できるのかを紹介します。


▼ そもそもXMODEMって何? ▼

 XMODEMはパソコン通信を行うために使われていた通信方法の一つ。非常に簡単な設定でバイナリデータの転送ができたので、たくさんのコンピュータやソフトでも実装されている。しかし、多くの問題点も抱えているらしい。

 他にも、YMODEMやZMODEM等もあるが、とりあえず必要なさそうなので、XMODEMを実装することにした。(今後、変えたほうが良さそうならば、また調べるかもしれません。)

▼ ブロックの構造 ▼

 XMODEMは、データを「ブロックと呼ばれる単位」で送信します。そのブロックの構造を図1-1に示します。

 データを128バイト、その他を1バイトずつ送信するので、1ブロックの合計は132バイトになります。では、図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をもう一度送信し、通信を終了します。

 最後に、制御文字を表にまとめておきます。

制御文字一覧
16進コード意味発信源
0x01SOHStart Of Heading送信側
0x04EOTEnd Of Transmission送信側
0x06ACKACKnowlege受信側
0x15NAKNegative AcKnowlege受信側
0x18CANCANcel両方可
0x1ASUBSUBstitute両方可

 以上で通信方法の説明を終わります。

▼ 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


[TOP]
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送