VC++2005で作成したプログラムで、PICなどの機器からRS-232C経由でデータを取得します。
サンプルではPICに決まった書式で延々データを吐かせて、プログラムで受信しています。
PICと計算機の間にFTDIのFT232RL、FT245RLなどを入れることで、計算機側のUSBでデータを受け取ることもできます。
「PIC」→「RS-232C」→「FTDI Chip」→「USB」→「計算機」。
Windowsではマルチスレッド、イベント形式がCPU資源に優しいと思われます。
Webを彷徨ったところ、C++やMFCが苦手な私でも使えるライブラリが見つかったので利用しました。
環境
- Windows XP Pro SP2
- Visual C++ 2005 SP1
- http://www.tetraedre.com/advanced/
- 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
構成図
ソース
- RS232C-TETRAEDRE.zip
- pic-rs232c.c
- pic-rs232c.hex
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
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; }
参考文献
- http://www.tetraedre.com/advanced/
- http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2503
- http://www.geocities.jp/terukat/_geo_contents_/win/index.html
- http://www.med.osaka-u.ac.jp/pub/anes/www/software/DataAcquisition.html
- http://members.jcom.home.ne.jp/0434383301/vc10.htm
Comments