2015年11月10日火曜日

Excel VBA いまさらの Win32API シリアル通信

10年以上前に取り組んだ時はMSCommで実現していたが、Windows 更新プログラムの適用で使えなくなってしまうのでまずい。

今回は別の手段、APIによる方法を試す事にした。いくつかのサイトを見て、例文を使わせてもらっい、指定の時間間隔でデータを取り込んでEccelシートに書き込み、グラフ(スパークライン)表示するところまで、大きな困難も無く数日でデモ用簡易版プログラムは完成した。

ところが、依頼者のパソコンで使うとまるでダメ。開発機と違う自分のパソコンでも再現、半分以上の受信データを取り逃がし、根本的に問題有りと気づかされる。
開発機でまれに起きていた時は、何か端末側で他のタイミングとぶつかるためで、リトライすればいいと考え、対策した。
よく考えれば、送信処理後、送り終わったかは確かめもせず、すぐに受信処理に入る手順でもたまたまよかったに過ぎない。通信速度が115200ではなくて、9600bpsだったら全くダメだったかもしれない。
コマンド送信後に固定タイマを入れることで、データを取り逃がすことは無くなり、デモ用のプログラムは翌日渡せた。


本ちゃんの依頼が来たら、タイマで済ませられないので、解決策を講じないといけない。
  • VB2005では新しい解決法(SeriaPort コントロール)が提供されているが、それは使えない
  • 実際は、受信データ長がシステム構成で変わる(受信終了までの時間が変わる)
  • データ要求コマンドに対する反応時間(一文字目)が、どのくらい変動するものかも不明
  • 通信速度を変えてもOKにするにはイベント駆動する必要がある
  • オシロスコープの出番
  • 毎回、返答が無い場合(断線や、電池切れ)を想定して対処する必要がある
イベント駆動について調べると、途端にハードルが上がり、頭に入ってこない。分かることは
  • 送信終りのイベント検出
  • 受信データの先頭文字は固定文字である
  • 送信内容から受信文字数は計算できるので、正常受信完了は分かるはず