VBとRS-232CとExcelでデータを記録する

工作

Visual Basicで作成したプログラムでPICなどの機器からRS-232C経由でデータを取得して、Excelに自動で記録するプログラムです。

サンプルではPICに決まった書式で延々データを吐かせて、VBプログラムで受信、処理してExcelに出力しています。
PICと計算機の間にFTDIのFT232RL、FT245RLなどを入れることで、計算機側のUSBでデータを受け取ることもできます。
流れは「PIC」→「RS-232C」→「FTDI Chip」→「USB」→「計算機」になります。
最近はUSB機能付きのマイコンが多くなってきたので、FTDIのICを使わなくても良くなりました。

VBAとWIn32 APIの組み合わせ(タイマー割り込みでポートを監視する方法)で同様のことが出来ることは確認済みですが、どうせならタイマー割り込みでなく、スレッド、イベント割り込みでやりたいと思い、Webで公開されている「.NET Framework 2.0」のSerialPortを使ったサンプルを参考にして作成しました。

送信されるデータフォーマットが分かっていれば、どのような機器にも対応できると思います。
なお、仮想環境に構築したWindowsでも通信テストを行ったので、VMware Playerの設定もメモしてあります。

環境

  • Windows XP Pro SP2
  • Microsoft Excel 2003
  • .NET Framework 2.0
  • Visual Basic 2005 SP1
  • PIC 16F84A、又はPIC 16F877A
  • CCS Cコンパイラ PCM ver.4.012
  • 秋月 PIC ProgrammerV4 ver.6.61.48
  • 秋月 PICプログラマー ver.4 AE-PGM877 V6.61
  • シリアルケーブル 9pin ストレート
  • FT232RL.pdf
  • FT245RL.pdf
  • VMware Player ver.2.0.0 build-45731

VBからExcelを操作するための設定

VBからExcelを操作する場合には、以下の操作をVB側で行っておく。
「プロジェクト」→「参照の追加」→「COM」→「Microsoft Excel 11.0 ObjectLibrary」を選択する。

メモ

・「SerialPort.BytesToRead」プロパティで現在受信しているバッファサイズが分かる。
・「SerialPort.ReadLine」を使用する場合は、送信側で改行コードを付加する。

よく分からない点

・時々、VB2005でプログラムのビルドを実行する毎に「conime.exe」のプロセスが残る場合がある。仕方なく手で消しているが、VB2005を終了しても残るので何とかならないものか・・・・。
・Invokeを使って受信処理中にデータをテキストボックスに表示させるとプログラムが不安定になる。

構成図

ソース

Excel-RS232C-net.zip

pic-rs232c.c

#include <16f84a.h>
//#include <16f877a.h>

#fuses HS, NOWDT, NOPROTECT
#use delay(clock=20000000)

//
// PIC16F84Aの場合、CCSのプリプロセッサコマンドを使用する。
// rev:受信, xmit:送信, パリティ:なし, StopBit:1, フロー制御:なし, データ長:8
//
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, parity=N, bits=8)

//
// PIC16F877Aの場合は、ポートC bit6:送信, ポートC bit7:受信
//
int main( void )
{
    byte  i, j, k;    // i, j, kはbyte型変数(符号なし8ビット整数)
    set_tris_a(0x00); // ポートAはすべて出力に設定(0:Output)
    set_tris_b(0x80); // ポートB(RB7入力,そのほかはすべて出力)

    i = 0;
    j = 9;
    k = 0;

    while ( 1 )
    {
        printf("A%uB%uC%u\n\r", i, j, k);
        delay_ms( 3000 );

        k = i % j;
        i = i + 1;
        j = j - 1;

        if ( i >= 10 ) i = 0;
        if ( j <= 0 )  j = 9;
    }

    return 1;
}

pic-rs232c.hex

:1000000000308A008428000083160611831206112E
:1000100008308D000B2800008D171C288D13970CBD
:1000200003180615031C06110D171C280D138D0B44
:100030000F281A2800000615A7308400840B1E28FC
:1000400021288D1B0E280D1B1628003418088D0141
:10005000170203182E2817088C003A288C01083044
:100060009900970D8C0D18080C0203188C008D0D4B
:10007000990B312800340D0815089700643098005A
:1000800026200C0895000D083030031D4E28961CC4
:10009000552896195528161A2030512896111612EF
:1000A00016148D070D0897000420150897000A30D4
:1000B000980026200C0895000D083030031D662896
:1000C00096196A28161C6A28161A20308D070D0802
:1000D000970004203030950715089700042000345D
:1000E00016308400831300080319832806308D001E
:1000F0008C018C0B79288D0B78287B308C008C0B35
:100100007F28800B7628B728840183131F3083054E
:1001100083160611831206150030650080306600D4
:100120009201093093009401413097000420120895
:1001300095001B3096003B204230970004201308A6
:1001400095001B3096003B20433097000420140894
:1001500095001B3096003B200A30970004200D309C
:10016000970004200C309500FA3096007028950B0B
:10017000B428120897001308980026200C08940051
:100180000130920793021208093C031C9201930864
:10019000031DCC2809309300942801308D006300A2
:02400E00F23F7F
:00000001FF
;PIC16F84A

VMware Playerで使用するOSのイメージ作成

QEMU ver.0.9.0でイメージを作成し、OSをインストールする。

  1. VMPlayerをインストールする。
  2. qemu-img.exe create -f vmdk “E:\os.vmdk” 4G
  3. 「os.vmx」ファイルを作成して編集する。(etch.vmx
  4. 「os.vmx」をダブルクリックしてVMPlayerを起動する。

VMware Playerのシリアルポート

書式は以下の通りだが、VMPlayerでは「COM2」として認識されている。

  • serial1.present = “TRUE”
  • serial1.fileName = “COM1”
  • serial1.autodetect = “TRUE”

EasyCOMMのNet対応版

こちらの方が使い易いかもしれない。
http://www.activecell.jp/ec/

今回参考にしたサンプルプログラム

http://www.vbstation.net/
http://www.vbstation.net/sample/0314.htm
http://www.microsoft.com/japan/msdn/netframework/skillup/core/article2.aspx

VB2005への対応

Technical documentation
Read in-depth developer documentation about Microsoft tools such as .NET, Azure, C++, and Microsoft ...

VBによるシリアルポートの操作

http://www.microsoft.com/japan/msdn/vbasic/migration/tips/SeriaPort/
http://www.happy500z.com/

Excelを呼び出す場合の注意点が詳しい

VBレスキュー(花ちゃん)のトップページ
VBレスキュー(花ちゃん)のトップページ - VBレスキュー(花ちゃん)

VB2005でのWin32 APIの使い方

.NET TIPS Win32 APIやDLL関数に構造体を渡すには? - C# - @IT

FTDI社

Future Technology Devices International Ltd - FTDI

その他

VB.net RS232c通信を行うクラス

Comments