http://www.999.co.jp/usbcid2-jp/index.html
こいつになでしこから接続して流れてくる文字列を読む必要があったので接続してみた。


まず、WIN32APIから必要な関数をロード。


●CreateFile({参照渡し}filename,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile) = DLL("KERNEL32.DLL",
"HANDLE CreateFileA(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)")

●CloseHandle( hObject ) = DLL( "KERNEL32.DLL" ,
"BOOL CloseHandle(HANDLE hObject)")

●ReadFile(hFile,{参照渡し}pBuffer,nNumberOfBytesToRead,pNumberOfBytesRead,{参照渡し}pOverlapped) = DLL( "KERNEL32.DLL" ,
"BOOL ReadFile(
HANDLE hFile,
LPCVOID pBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD pNumberOfBytesRead,
LPOVERLAPPED pOverlapped
)")

●WriteFile(hFile,{参照渡し}pBuffer,nNumberOfBytesToWrite,pNumberOfBytesWritten,{参照渡し}pOverlapped) = DLL( "KERNEL32.DLL" ,
"BOOL WriteFile(
HANDLE hFile,
LPCVOID pBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD pNumberOfBytesWritten,
LPOVERLAPPED pOverlapped
)")

●SetCommTimeouts(hFile,{参照渡し}lpCommTimeouts) = DLL( "KERNEL32.DLL" ,
"BOOL SetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
)")

●GetCommTimeouts(hFile,{参照渡し}lpCommTimeouts) = DLL( "KERNEL32.DLL" ,
"BOOL GetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
);")

今回は読むだけなので
「CreateFile」「CloseHandle」「ReadFile」「SetCommTimeouts」
があれば問題ないのだけど一応他のも読み込んでおきました。



接続準備。

□CreateFile用のパラーメータの定数を定義します。


!GENERIC_READ = $80000000。
!GENERIC_WRITE = $40000000。
!OPEN_EXISTING = 3。

□SetCommTimeouts関数用の構造体を定義。

■COMMTIMEOUTSGROUPとは
 ・ReadIntervalTimeout
 ・ReadTotalTimeoutMultiplier
 ・ReadTotalTimeoutConstant
 ・WriteTotalTimeoutMultiplier
 ・WriteTotalTimeoutConstant

COMMTIMEOUTSとはCOMMTIMEOUTSGROUP。
COMMTIMEOUTSのReadIntervalTimeout = 0。
COMMTIMEOUTSのReadTotalTimeoutMultiplier = 1。
COMMTIMEOUTSのReadTotalTimeoutConstant = 50。
COMMTIMEOUTSのWriteTotalTimeoutConstant = 50。
COMMTIMEOUTSのWriteTotalTimeoutMultiplier = 1。
PACK( COMMTIMEOUTS , COMMTIMEOUTS2 , "LONG,LONG,LONG,LONG,LONG")。

この場合「COMMTIMEOUTS2」が作成された構造体です。
構造体の中身ついては、ここを参考にしました。



では接続してみましょう。まずはCreateFile関数を実行します。


h = CreateFile( "COM3" , GENERIC_READ + GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)。

こんな感じです。1番目の引数へCOMポートの名前を入れます。
hへハンドルが代入されます。

では読み込みましょう。ReadFile関数を利用します。


READSIZE = 20。#読み込むバッファサイズ。
BUFとは文字列。#この変数へ読み込んだ内容がセットされる。
BUFにREADSIZEを確保。#ポインタなので必要サイズを確保する。
READEXESIZEとは整数。
RESULT = ReadFile( h , BUF , BUFのバイト数 , POINTER(READEXESIZE) , 0 )。

上記の場合変数BUFにREADSIZEに指定したサイズ分読込みが行われます。
サイズが未確定の場合は、ループやタイマーを使って必要分読み出します。
1番目の引数は、CreateFileで取得したハンドルですね。

最後にCloseHandle関数で切断します。


CloseHandle( h )

この関数においても「h」はハンドルです。



って感じです。このご時世COMポートなぞあまり使いどころがないかもしれませんよね…(^-^;
何かの参考になれば。。。

各WIN32API関数についてはMSDNのサイトなんかを見るとわかるでしょう。
また、なでしこにおいてのWIN32APIの使い方は、
しらたまさんが詳しく説明していらっしゃいます。(非常に分かりやすいです)

なでしこは、WIN32APIを使うような高度なプログラミングも分かりやすく使うことができるので、
高度なプログラミングの学習にも最適です。
DelphiやVBやC#を使うのもいいですが、
これらは、WIN32APIをうまくラップして、
ユーザーが意識することなく利用できるように作成されているため、
根本的な学習はできませんし、
ラップされているので逆に使うのが難しかったりすることもあります。

わたしも過去VC++で挫折してました。
VBに逃げようかと思ったのですが、個人的にVBの文法が大嫌いで、
もうWindowsプログラミングをあきらめていたときに、
なでしこに出会いました。
個人的には、日本発のVBくらいの言語だと思っています。
今後も学習や業務にガンガン利用しますよ。