標準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;
}
//