VC++とRS-232C

Windows

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

構成図

ソース

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