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を使って受信処理中にデータをテキストボックスに表示させるとプログラムが不安定になる。
構成図
ソース
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をインストールする。
- VMPlayerをインストールする。
- qemu-img.exe create -f vmdk “E:\os.vmdk” 4G
- 「os.vmx」ファイルを作成して編集する。(etch.vmx)
- 「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への対応

VBによるシリアルポートの操作
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/SeriaPort/
http://www.happy500z.com/
Comments