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

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

WindowsアプリケーションでRS232Cにアクセスするためには、WindowsAPI(Win32)のCreateFile()を使って、「オープン」する、
というところまでが、前回のお話でした。

Windowsアプリケーションではなくて、DOSプロンプトの中だけで動く、CUI(Console User Interface)アプリケーションを作りたいだけなのですが、WindowsXPはI/Oデバイスに直接アクセスすることを許してくれません。
おまけに、実際にはRS232CではなくてUSBにアクセスしなければならないのですから、昔のDOSアプリケーションではどうしようもありません。

ところが、このWindowsアプリケーションなるものが、実にわかりにくい、ときています。
RS232Cを使うには、Win32アプリケーションのCreateFileを使う、というところまではつきとめたのですが、そのパラメータがなんとも仰々しくて、今一つよくわかりません。


/// 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;


ネットを検索すると、あちこちで同じような記述を見つけます。
どこかにソースがあるはず。
そいつを確認したい、と思ってあちこち捜しまわったら、やっと見つかりました。

●MSDNのサイトにありました

なんてことはない、あちこち捜しまわった挙句、本家本元、Microsoftのサイトにしっかりと書いてあることがわかりました。
CreateFileについてはこちらのページにあります。

同じページですけれど、ちょいとコピーしてみました。



このページに、各パラメータについての説明がしっかりと書いてありました。
そして、その説明のずっと下のところに、こんなことが書いてありました。



うーん。これだけで全てがわかったわけではありませんが、ともかくアクセスモードは、読み書き両方使いますから、読み書きをORにして
GENERIC_READ|GENERIC_WRITE
にすればよいようですし、共有はできるわけがないので、0を指定します。
セキュリティもよくわからんけれども、NULLを指定するようです。
次の、作成方法と最後のテンプレートファイルは、上の説明から、それぞれOPEN_EXISTING及びNULLを指定します。
ファイル属性は、とくにコメントはないようですが、FILE_ATTRIBUTE_NORMALが妥当なようです。

通信の詳細については「Communications」を見よ、と書いてありますが…。それってどこ?
見つかりませんでした。

さて、CreateFile()がうまく実行できると、ファイルハンドルが渡されます。
以後はこのファイルハンドルを使ってRS232Cにアクセスすればよいのですが、まだOPEN()の処理は終わりません。
RS232Cで通信するのですから、ボーレートとかパリティとかを決めなければいけません。

その設定はDCB構造体にあります。

●DCB構造体、GetCommState()、SetCommState()

あれもこれもそれも、みんなWindowsAPIです。もう、たまりません。
DCB構造体なるところに、RS232Cの通信条件が詰まっています。
これを、まずGetCommState()で読み込んで、必要なところのみ書き直したあと、SetCommState()でセットします。


/// 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;

if()は冗長です。
この前のCreateFile()でハンドルが取得できていれば、ここでエラーが帰ってくることはありえませんから、実際にはここはif文である必要はありません。
でも、SetCommState()は省略できません(それは、わかりますよね)。

さてここまでで、RS232Cの設定は完了してしまいたいところなのですが、もうひとつ、どうやらタイムアウトの設定が必要らしいことがわかりました。
まったくもって、なかなかにしんどいことです。
説明するのもいささか疲れてしまいましたので、そのことについては、また次回、ということにいたします。
2009.7.18upload

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