標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第277回]

●RS232C受信プログラムです

USBポートを使って「つくるCPU(MYCPU80)」との間でデータ(プログラム)を送信、受信できますが、実際にはUSB<>RS232C変換ICを使って、RS232Cで送受信を行います。
USB<>RS232C変換IC(FTDI社、FT232RL)を使うと、プログラムの側からはUSBポートがRS232Cポートとして認識されるようになります。

「つくるCPU(MYCPU80)」の側は、この通信部分はPIC16F88が受け持ちます。
そしてWindowsパソコンの側は、Borland C++コンパイラで作成した、通信プログラムを使います。

RS232C送信プログラムは、[第189回]で、プログラムリストを紹介しました。


RS232C受信プログラムは、当初はその必要がなかったので、ずっと作らないできたのですが、[第256回]になって、「つくるCPU(MYCPU80)」のテストプログラムの実行結果のデータを、Windowsパソコンに送ることになったため、そこでまたBorland C++コンパイラを使って、受信プログラムr232.exeを作りました。

ただその時点では、テストプログラムの紹介やら説明やらを優先しましたので、r232.exeについては、「いずれご紹介いたします」だけで終わってしまいました。

ここまできて、やっと一区切りついてきましたので、r232.exeのリストをご紹介することに致しました。
プログラムの内容について、多少の説明もできるとよいのですけれど、本日のところは、ちょっと時間がなくなってしまいましたので、プログラムリストのみお見せします。


/// r232.cpp for mycpu80
//  09/6/2
//  09/6/3 6/4
#include <windows.h>
#include <stdio.h>
//
        FILE *wfp;
        char inbf[4096]="\0";
        char comname[5]="\0";
        char *fname;
        int i;
        int d;
        unsigned long int rdbytes;      
        HANDLE hcom;
        int open();
///
void main(int argn,char *args[])
{
fname=args[1];
//file open
if(!(wfp=fopen(fname,"wb")))printf("can't open %s\n",fname);// pass to end
//
else
{
sprintf(comname,"COM3");
if(!open())printf("can't open %s\n",comname);// pass to end
else
{
//receive data & write file
        printf("start\n");
//  rs232c read
        if(!ReadFile(hcom,&inbf,4096,&rdbytes,NULL))printf("%s READ ERROR\n",comname);
        else
        {
//  write data to file
        i==0;
while(i<=rdbytes)
        {d=inbf[i];fputc(d,wfp);
        printf("[%x]",d);// for test
        if(d==0x0A)break;
        i++;}
        printf("\n%dbytes received\n",i);
        }
// com & file close     
        CloseHandle(hcom);
}
        fclose(wfp);
        printf("end\n");
}
}
///
/// com open
int open()
        {
        hcom=CreateFile(comname,GENERIC_READ|GENERIC_WRITE,0,NULL,
        OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hcom==INVALID_HANDLE_VALUE)return 0;
// set timeout
        COMMTIMEOUTS timeout;
        timeout.ReadIntervalTimeout=100;//ms
        if(!SetCommTimeouts(hcom,&timeout))return 0;
/// get DCB
        DCB dcb;
        GetCommState(hcom,&dcb);
        dcb.BaudRate=2400;
        dcb.ByteSize=8;
        dcb.Parity=NOPARITY;
        dcb.StopBits=ONESTOPBIT;
        dcb.fRtsControl=RTS_CONTROL_ENABLE;
        if(!SetCommState(hcom,&dcb))return 0;
        return 1;
        }
//

2009.7.13upload

前へ
次へ
ホームページトップへ戻る