データを送る(Excelでシリアル通信-3)

Excelからシリアル通信を実現してみようという連載の3回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回はマイコンボードArduinoを使って、簡単なシリアル通信モニター(以後、通信モニターと呼びます)を作りました。これがあれば通信内容を確認しながら開発を進められるので便利です。

今回はこの通信モニターを使ってPCからデータを送信してみます。

接続ポートの確認

実際のデータ送信を行う前に、通信モニターを接続してその接続状況を確認してみましょう。デバイスマネージャー「ポート(COMとLPT)」で接続が確認できると思います。僕の環境ではCOM8となっていました。

ArduinoIDEからの確認

ArduinoIDEにはシリアルモニター機能が装備されています。これを使えばシリアル通信モニターと通信ができます。接続した状態で上で確認した接続ポートを選択したうえでシリアルモニターを起動してみましょう。 ArduinoIDEを起動してメニューのツールからシリアルポートを選択して、上で確認した接続ポートに設定しましょう。次に同じくツールからシリアルモニターを選択して起動します。

シリアルモニターの設定は以下を参考にしてください。

hirocom777.hatenadiary.org

シリアルモニターの送信欄に文字を入力すると、受信欄に入力した文字がかえってくる思います。通信モニターの画面にも同じ文字が表示されます。

DOSプロンプト(バッチファイル)での確認

これでシリアル通信モニターの動作確認ができました。PCから直接データを送信してみましょう。まず送信データを記述するためのテキストデータ「Test.txt」を用意します。内容はシンプルなものにしましょう。今回は「ABC123」と書き込みました。

続いて「Test.txt」と同じ場所にバッチファイル「Test.bat」を作成します。内容は以下の様にしましょう。

Mode COM8 BAUD=9600 PARITY=N DATA=8 STOP=1
Timeout 3 > null
Copy Test.txt COM8
Pause

「COM8」の部分は先に確認したポート番号に書き換えてください。

1行目はポートの設定です。僕の環境では設定した後有効になるまでに少し時間がかかるようで、2行目はそのための3秒のウェイトです。3行目でテキストデータ「Test.txt」の内容をシリアルポートに送信します。4行目で動作が止まるようになっています。

シリアル通信モニターを接続した状態で「Test.bat」を実行してみましょう。コマンドプロンプトが立ち上がって、PCの画面は以下の様になったと思います。

C:\Data\ExcelVBAシリアル通信クラス>Mode COM8 BAUD=9600 PARITY=N DATA=8 STOP=1

デバイス状態 COM8:
------------
    ボー レート:        9600
    パリティ:           None
    データ ビット:      8
    ストップ ビット:    1
    タイムアウト:       OFF
    XON/XOFF:           OFF
    CTS ハンドシェイク: OFF
    DSR ハンドシェイク: OFF
    DSR の検知:         OFF
    DTR サーキット:     ON
    RTS サーキット:     ON


C:\Data\ExcelVBAシリアル通信クラス>Timeout 3  1>null

C:\Data\ExcelVBAシリアル通信クラス>Copy Test.txt COM8
        1 個のファイルをコピーしました。

C:\Data\ExcelVBAシリアル通信クラス>Pause
続行するには何かキーを押してください . . .

最初の初期設定を行うと、ポートの設定状況が表示されます。少し時間をおいてから、Test.txtの内容を送信します。

Excelからの確認

ここまでの流れを踏まえて、Excelからデータを送信してみたいと思います。以下のプロシージャを入力して実行してみてください。

Public Sub SerialComTest()

  Dim objShell As Object
  Set objShell = CreateObject("WScript.Shell")
  objShell.Run "cmd.exe /c mode COM8 BAUD=9600 PARITY=N DATA=8 STOP=1"
  Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 3)
  objShell.Run "cmd.exe /c copy " & ThisWorkbook.Path & "\Test.txt COM8"
  Set objShell = Nothing

End Sub

設定と送信の間の時間調整は「Timeout 3 > null」だと上手く機能しなかったので、「Application.Wait」に書き換えました。実行するとシリアル通信モニターに同じように表示されると思います。これでExcelからシリアル通信でデータを送信できました。

まだまだ色々問題が

でも、まだまだ問題がありますね。まずデータを送信するのにテキストファイルを用意しなければなりません。また、残念ながらデータ受信は実現できませんでした。 あと僕のPCでは、このプロシージャを実行するとインストールしてあるウィルス対策ソフトに引っ掛かって、実行中止となってしまいました。(一時的に対策ソフトをOFFにして実行しました。)

別の方法を考える

いかがでしょうか。これで通信モニターの動作確認ができました。また、これで(色々ありますが)一応Excelからデータ送信できました。でもこれでは実用化にはほど遠いですね。次回は別の方法でアプローチしてみましょう。お楽しみに!!

hirocom777.hatenadiary.org