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

●RS232C受信プログラムの説明です(4)

簡単に済ませようと思っていたのですけれど、なにかとんでもない藪の中に踏み込んでしまったみたいです。
ほんと、止めておけばよかった…。

前回の終りにも少し書いたのですが、C(C++)自体が面倒なところにもってきて、このWindowsAPIがさらにわからん、という感じなのですね。
黙っていれば、わからないままで素通りできたものを、なまじコメントなどしようと思いついたりするものですから、どんどん泥沼にはまってしまいます。

だいたいWindowsAPI自体が実に捕らえどころがない、です。
一般にはWin32というのだそうですけれど。
そしてC++でそれを使うには、まずWindows.hをインクルードするべし、ということなのだそうですね。
でも、そこから先はどうすればいいの?

●まずは、ファイルOPENです

Win32の世界では、RS232Cもファイルとして扱います。
当然、OPENしなければなりません。

ああ。232Cではなくて、受信したデータをSAVEするためのファイルのOPEN、こちらの方は簡単です。

●先に、データファイルのOPENです


fname=args[1];
//file open
if(!(wfp=fopen(fname,"wb")))printf("can't open %s\n",fname);// pass to end

r232.cppの中でデータ保存用ファイルをOPENしている部分です。
r232.cppのリストは[第277回]にあります。

この中でも、実際にファイルをOPENするコアの部分は、
wfp=fopen(fname,"wb")
のところだけですから、実に簡単です。
話のついでですから、簡単に説明をしてしまいます。

fopen関数は標準I/O関数です。
stdio.hにあります。

wfpはFILE構造体へのポインタです(任意の名前で可)。
プログラムの先頭でその宣言をしています。

FILE *wfp;

fnameはコマンドライン引数として読み込んだファイル名を示すポインタです。
”wb”はファイルの属性です。
このファイルはデータを書き込むためのwriteファイルで、かつバイナリデータを書き込むファイルですから、wでかつbです。
これだけを指定してfopen関数を実行すると、wfpにはopenされたファイルにアクセスするためのもろもろの要素を定義するFILE構造体へのポインタが入れられます。
このwfpを使って、open後のファイルアクセスを行います。

●データファイルに1バイトのデータを書き込みます

fputc関数を使います。

d=inbf[i];fputc(d,wfp);

d=inbf[i];については説明が必要かもしれませんが、それについてはまた後ほど。
ここでは、受信バッファから1バイトのデータを取り出して、変数dに入れたうえで、そのdの値を、fputc関数をCALLしてwfpで示される情報にしたがってファイルに書き込みます、ということだけをご理解ください。
なんてことはないでしょう。いとも簡単なものです。

ファイルに全データを書き込んでしまったら、

fclose(wfp);

で終りです。実に簡単です。

でも、こちら(RS232C)の方は、そんなに簡単にはいきません。
なんたって、WindowsAPIですから…。

●いよいよRS232CのOPENです

RS232CアクセスのためのAPIには、OPENというのはありません(のようです)。
CreateFileというAPIを使います。
WindowsAPI(Win32)を使うためには、windows.hをインクルードしておかなければいけません(これは前回も書きました)。


#include <windows.h>
#include <stdio.h>

open()というAPIはないのですけれど、WindowsAPIを使っても、結構ごちゃごちゃ書かなければならないようですから、勝手に、open()という関数を作ってしまいました。

そのopen()の最初のところです。


/// 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;
open()はmain()の後ろに書きますから、main()の前に定義しておかなければいけません。
      
        HANDLE hcom;
        int open();

ついでに、CreateFile()で取得するハンドルも一緒に定義しておきます。どんな名前でもよいのですけれど、hcomにしておきます。
comnameにはRS232Cポートを示す名前”COMx”を入れておきます。
USB−RS232C変換IC(FT232RL)のドライバが起動すると、たいていは”COM3”に割り当てられますから、このプログラムでは、とりあえず”COM3”にしています。
CreateFileで”COM3”を指定して、うまくRS232Cにアクセスできたら、hcomには、そのハンドルが返されます。
以後のアクセスは、そのハンドルを使って行います(もちろん以後のアクセスもWindowsAPIを使って行います)。

●CreateFileについての情報はどこに?

ではCreateFile()の中にごちゃごちゃ書いている、なんだかややこしい、これはいったいなんなのだ、といいますと、これがなかなかに大変なのです。
ネットを検索すると、あちこちで同じような記述を見つけます。
でも、どこかにソースがあるはず。
そいつを確認したい…。

で、やっとのことで、みつけました。
なんだ、こんなところにあったのか。
ということで、それについてご紹介を申し上げるところで、本日も、はや、タイムアウトになってしまいました。

すみません。
本日は週末のことゆえ、早仕舞いです。
これから、スーパー銭湯と、そのあとは「金麦」です。
みなさまも、どうか、ごゆっくり…。
2009.7.17upload

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