Communication Bridge修正

 KDXがネットワークの授業でCiscoのルータを扱うので、私の実験に付き合ってもらおうとCommunication Bridgeを持たせてCiscoルータに繋げてもらったら途中で止まって使い物にならないという結果になった。
 
 しかしKDXの話を聞くだけでは、どういうバグなのか分からないので実際にルータを触って確かめたい。丁度、宴会が終わったY内研のT君が居たので、ITセミナー室に入れてもらい、実験してみる。
 
 すると、確かにKDXが言ったように止まる。YESかNOで聞かれるところで止まるのだが、このままじゃ良く分からないので、Communication Bridge側のデバッグウィンドウを見てみる。
 
 すると、リターンを押したときのCR(キャリッジリターン)+LF(ラインフィード)の処理がおかしい。CR(0x0D)の後にNULL(0x00)をくっつけて送っている。CR+LFとやったときも(0x0D Ox00 Ox0A)となっている。原因は分かったので、そのまま研究室に戻って原因調査開始。
 
 で、色々調べてみた結果、ターミナルによって結果が違うことに気づいた。

  • TeraTermPro(0x0D 0x00)
  • Poderosa(0x0D 0x00)
  • Putty(問題なし、但し設定が必要)
  • Windows付属のTelnet端末(問題なし)

 
 どうやら、ネットで調べると、0x00をつけるのは通信相手に優しい仕様らしい。つまり0x00が終端文字列なので、そこまでがコマンドであることを明示的に示すようにしているようだ。しかし、相手はシリアルケーブルで直結されたCiscoルータ。あんまり関係ない気がする……というか、エスケープシーケンスにNULLが変換されて、それまで文字列と誤認識されてしまうようだ。
 
 そこで、0x00を弾くことにした。MSComm32コンポーネントはNullDiscardというプロパティを有効にすることでNULLを弾くことが出来る。
 
 しかし、これを全ての場合に有効にしてしまうと、RFID班では0x00が混じったバイト列も普通に送るので困る。というわけで、インターフェースをちょっといじってチェックボックスで自由に選択できるようにしておいた。
 
 修正完了したのは明け方前ぐらいだったので、実験することが出来なかったが、また実験しに行けばいいだろう。Communication Bridgeのバージョンは1.03にあげておきました。