片道2時間の東海道新幹線乗車時の暇つぶしとして、バイクツーリング記録用に購入したGPSロガー(Holux M-241c)を持ち込んで遊んでいました。
GPSロガーの液晶画面にも『進んでいる方向 [東西南北8方位]、速度 [km/h]、標高 [m]』が表示されるので、それを見ていると今時速何km/hで走っているのか判って楽しい~!
・GPSロガー M-241c |
のですが、USBケーブルでPCにつなぎ、かつ地図ソフト(SuperMapple Digital Ver.9 = 以下、SMD9)を起動すると、今の自分の場所を表示するハズなのです・・・・
https://…/2008/07/06/ スーパーマップル・デジタルVer.9~優待販売
https://…/2009/11/10/ GPSロガー Holux M-241c
・地図ソフト SMD9 |
しかし、上手くいかない!
https://…/2010/03/02/ リアルナラ
そこで、自宅に戻っていろいろと調べてみたのです。
まずは、GPSロガー/地図ソフトの相互通信準拠規格は・・・・
機器 | 準拠規格 |
---|---|
SMD9 | NMEA-183 |
GPSロガー | NMEA-183 |
おっ、合致しているジャン。
細かく調べていくか・・・・。まずはGPSロガーとSMD9の接続はこんな形になっています。
・GPSロガー/SMD9の通信経路 |
GPSロガーとPCはUSBケーブルで接続し、ドライバーによって仮想COMポート(プログラムポート)として出現します。
Windows上のアプリケーション(SMD9も当然ココ)は、COMポートをオープンしてシリアル通信をするプログラムを書けばよいのです。
シリアル通信で問題になるのが、通信速度等のパラメータ。まずはGPSロガーのパラメータを調べてみました。
GPSロガー M-241c | 値 |
---|---|
通信速度 | 38,400 [bps] |
データ幅 | 8 [bit] |
パリティ | なし |
ストップビット | 1 [bit] |
フロー制御 | なし |
これをいろいろ変えてみようかと思ったのですが、どうがんばってもこのパラメータから変えられない固定値みたいです。
次に、SMD9のパラメータの方も調べてみましたが、こちらが要求するパラメータは次の値でした。
SMD9 | 値 |
---|---|
通信速度 | 4,800 [bps] |
データ幅 | 8 [bit] |
パリティ | なし |
ストップビット | 1 [bit] |
フロー制御 | なし |
あれ~、通信速度が合わないジャン! SMD9の方もパラメータを変更する手段がありません。(iniファイルやレジストリにも無い!)
・双方が通信経路に要求するパラメータが違う! |
なんでこんな事態が起こるの(?)(?)(?) この辺りは"NMEA-183"という規格文書(英語)を読んでみると、次のように規定してあります。
NMEA-183 | 値 |
---|---|
通信速度 | 4,800 [bps] |
データ幅 | 8 [bit] |
パリティ | なし |
ストップビット | 1 [bit] |
フロー制御 | なし |
おいおい~、SMD9の方が正解じゃないか!
ところが、SMD9の後継、SMD10では通信速度を変更できるようになっているようで、SMD10以降であれば普通に接続できるし、インターネットでググッても『SMD10を使うべし』との結論で落ち着いています。
なんじゃその安易な解決策は~。
しかし、さらに規格文書を読みつづけていくと・・・・
NEMA-183 にバージョンという概念があり、バージョン3以降はハイスピードモードというものが規定されていて、NMEA-183-HSと表記するとかなんとか書いています。そして、その規格の内容は・・・・
NMEA-183-HS | 値 |
---|---|
通信速度 | 38,400 [bps] |
データ幅 | 8 [bit] |
パリティ | なし |
ストップビット | 1 [bit] |
フロー制御 | なし |
となっています。結局双方の機器ともに、その時点の最新の規格を満たしていたんですね~。だから双方とも通信速度を変えられなかったのか・・・・。
原因がわかったところで、対策です。通信電文の中味は多少拡張された程度でそんなに変わっていないのでなんとかなるかな。
- SMD9をバージョンアップして、SMD10にする。
- SMD9をリバースエンジニアリングして、通信速度4,800[bps]に設定しているところを書き換えて、38,400[bps]にしてしまう。
- 通信速度を変換するためのソフトを自分で作る。
まず、1は却下!
2は時間がかかりそうだけどスマートな作戦。試しにSMD9のプログラムをさらっと見てみたけど、"GPS.DLL"なんてファイルがあり、通信速度を設定するAPI"SetCommState"とかをダイナミックリンクしてるので、この辺りを中心に探ればよいんだけれど・・・・
時間が読めないのは社会人には辛いので保留!(←ライセンス的にもリバースエンジニアリングは禁止されている可能性大!)
結果、3にします。
まずは、PC内に仮想COMポートを作って、ループバックするようにします。この手のソフトは巷にたくさん溢れています。GPLライセンスで使えるやつがありました。
http://com0com.sourceforge.net/ Null-modem emulator (com0com)
Setup.exeをたたき、仮想COMポートをCOM11とCOM12として命名するだけで作業は完了です。
command> change CNCA0 PortName=COM11
command> change CNCB0 PortName=COM12
実際にはこんな感じのイメージになります。
・仮想COMソフトをインストールして、COM11とCOM12でトンネルを作成 |
そして、SMD9はCOM12に接続させるようにして、COM4とCOM11の間で単純に受け渡しするソフトを作り立ち上げます。
・全体構想図 |
ソフトを作るといっても、単純にCOM4ポートから受信して、COM11ポートに書き込むだけ・・・・。エラー処理やらまったくせず、単なるリピーター・・・・
そしてもう一度実験すると・・・・
バッチリ、SMD9が自動的に自宅のある場所を中心に表示して、カーナビみたいな矢印が出てきました。(残念ながらスクリーンショットは自宅の場所がわかってしまうので非公開です。)
よし、これで次回の新幹線出張もコンセントが確保できるN700の窓側狙いで!(笑)
一応、10分で作った駄作のソフトのソースコードをつけておきます。Cコンパイラでコンパイルしてね。