TOP Win32API Serial Programming Serial Port Win32 Communication Resource


Event Driven Programming

  1. Initialize
    1. CreateFile to open file
    2. SetupComm to set buffer size in driver. (optional)
    3. PurgeComm to flush buffer.
    4. GetCommProperties to check buffer size (optional)
    5. SetCommState to setup Serial Port using DCB (Device Control Block) structure. 9600,N,8,1 etc.
    6. SetCommTimeouts to set up timeouts.
    7. CreateEvent to set OVERLAPPED structure for later use.
    8. initialize thread flag to true before the following thread starts.
    9. CreateThread for an new thread that takes care actual communication.
    10. to terminate thread set flag to false.
  2. Thread
    1. SetCommMask to select the event. EV_RXCHAR | EV_TXEMPTY
    2. (Don't use C runtime library functions to avoid memory leak.)
    3. loop while thread flag == true
      1. WaitCommEvent to check event occurs.
    4. ExitThread (optional)
  3. atexit
    1. set thread flag to false to terminate.
    2. GetExitCodeThread to check if thread is still running. if yes, use ExitThread to terminate nicely.
    3. CloseHandle to remove thread handle
    4. CloseHandle to remove file handle

types

Sync

CreateFile()の引数dwFlagsAndAttributesをNULLとすると、同期として動作
このモードでは、ReadFile()は指定したサイズの受信が完了するまで戻らない。
事前に、現在の受信バッファ中のデータ数を調べ、ReadFile()の引数に指定する。
又はタイマー設定を、すぐ戻る設定にする。
受信されたデータ数をReadFile()を呼び出す前に知る
ClearCommError()COMSTAT構造体へのポインタを返す。
COMSTAT構造体のメンバーには現在までの受信データサイズを示すcbInQueがあり、これを参照することで受信データ数を知る。

ClearCommError()はエラーを消すので、受信数を得る目的でこの関数を呼んだ場合でも、エラーのチェックを行う必要があり。

Async

CreateFile()の引数dwFlagsAndAttributesを有効な値に設定し、ReadFile()にOVERLAPPED構造体を指定すると非同期として動作

このモードでは、ReadFile()を呼び出すと、関数から直ちに戻る。
実際の受信は、バックグウランド実行され、GetOverlappedResult()で受信結果を得る。

Event Driven

SetCommMask()でデータ受信などのイベントをセット
WaitCommEvent()でイベント発生を待つ。
WaitCommEvent()でデータ受信が発生すると、受信データサイズを得てReadFile()で実際に受信データを読み出す

この場合も同期と非同期がある。
通常このイベント駆動のWaitCoomEvent()は受信のためのスレッド中に配置。

イベントの種類
意味
EV_BREAKブレークを検出
EV_CTSCTS信号が変化
EV_DSRDSR信号が変化
EV_ERRフレーミングエラー又はオーバーランエラー又はパリティエラーが発生
EV_RINGリンギングを検出した
EV_RLSDCD信号が変化した
EV_RXCHARデータを受信し、受信バッファに格納
EV_RXFLAGDCB構造体のEvtCharに設定のデータを受信
EV_TXEMPTY送信バッファから最後のデータを送信

Win32 Serial API

BuildCommDCB

MSDN
指定したDCB構造体に、デバイス制御文字列で指定した値を格納します。デバイス制御文字列には、modeコマンドの構文を使います。
BOOL BuildCommDCB(
  LPCTSTR lpDef,  // デバイス制御文字列へのポインタ
  LPDCB lpDCB     // デバイス制御ブロックへのポインタ
);
ex)
 BuildCommDCB("baud=38400 parity=N data=8 stop=1",&dcb);

BuildCommDCBAndTimeouts

MSDN
デバイス定義文字列をデバイス制御ブロックコードに変換した後、デバイス制御ブロックに格納します。デバイスのタイムアウト値の設定やタイムアウトの解除も可能です。タイムアウト値の設定に関する動作は、デバイス定義文字列の内容によって異なります。
BOOL BuildCommDCBAndTimeouts(
  LPCTSTR lpDef,                  // デバイス制御文字列へのポインタ
  LPDCB lpDCB,                    // デバイス制御ブロックへのポインタ
  LPCOMMTIMEOUTS  lpCommTimeouts  // COMMTIMEOUTS( 通信タイムアウト)構造体へのポインタ
);|

ClearCommBreak

指定した通信デバイスの回線切断状態を解除し、文字送信を再開します。
BOOL ClearCommBreak(
  HANDLE hFile   // 通信デバイスのハンドル
);|

ClearCommError

MSDN
通信エラーの情報を取得して、通信デバイスの現在の状態を通知します。通信エラーが発生した場合に呼び出し、デバイスのエラーフラグをクリアして次の入出力(I/O)操作を可能にします。
BOOL ClearCommError(
  HANDLE hFile,     // 通信デバイスのハンドル
  LPDWORD lpErrors, // エラーコードを受け取る変数へのポインタ
  LPCOMSTAT lpStat  // 通信状態バッファへのポインタ
);

CloseHandle

MSDN
開いているオブジェクトハンドルを閉じます。
BOOL CloseHandle(
  HANDLE hObject   // オブジェクトのハンドル
);

CommConfigDialog

ドライバが提供する設定ダイアログボックスを表示します。
BOOL CommConfigDialog(
  LPTSTR lpszName,   // デバイス名の文字列へのポインタ
  HWND hWnd,         // ウィンドウのハンドル
  LPCOMMCONFIG lpCC  // COMMCONFIG( 通信構成)構造体へのポインタ
);

CreateEvent

MSDN
名前付きまたは名前なしのイベントオブジェクトを作成または開きます
HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes, // セキュリティ記述子
  BOOL bManualReset,                       // リセットのタイプ
  BOOL bInitialState,                      // 初期状態
  LPCTSTR lpName                           // イベントオブジェクトの名前
);

CreateFile

次のオブジェクトを作成するか開き、そのオブジェクトをアクセスするために利用できるハンドルを返します。
•コンソール
•通信リソース
•ディレクトリ(開くだけで作成は不可能)
•ディスクデバイス(Windows NT/2000 のみ)
•ファイル
•メールスロット
•パイプ
HANDLE CreateFile(
  LPCTSTR lpFileName,                         // ファイル名
  DWORD dwDesiredAccess,                      // アクセスモード
  DWORD dwShareMode          ,                // 共有モード
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // セキュリティ記述子
  DWORD dwCreationDisposition,                // 作成方法
  DWORD dwFlagsAndAttributes,                 // ファイル属性
  HANDLE hTemplateFile                        // テンプレートファイルのハンドル
);

(example for event driven)
HANDLE m_hCommPort = ::CreateFile(szPortName,
            GENERIC_READ|GENERIC_WRITE,//access ( read and write)
            0,                         //(share) 0:cannot share the COM port                        
            0,                         //security  (None)                
            OPEN_EXISTING,             // creation : open_existing
            FILE_FLAG_OVERLAPPED,      // we want overlapped operation
            NULL                       // no templates file for COM port...
            );

CreateThread

MSDN
呼び出し側プロセスの仮想アドレス空間で実行するべき 1 個のスレッドを作成
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子
  DWORD dwStackSize,                        // 初期のスタックサイズ
  LPTHREAD_START_ROUTINE lpStartAddress,    // スレッドの機能
  LPVOID lpParameter,                       // スレッドの引数
  DWORD dwCreationFlags,                    // 作成オプション
  LPDWORD lpThreadId                        // スレッド識別子
);

THREAD_QUERY_INFORMATION is necessary in dwCreationFlags when GetExitCodeThread need to be used.

How do you use CreateThread() to create threads of functions which are class members?

EscapeCommFunction

指定した通信デバイスに、拡張機能を実行するよう指示します。
MSDN
BOOL EscapeCommFunction(
  HANDLE hFile,  // 通信デバイスのハンドル
  DWORD dwFunc   // 実行する拡張機能
);


ValueMeaning
CLRBREAK
9
Restores character transmission and places the transmission line in a nonbreak state. The CLRBREAK extended function code is identical to the ClearCommBreak function.
CLRDTR
6
Clears the DTR (data-terminal-ready) signal.
CLRRTS
4
Clears the RTS (request-to-send) signal.
SETBREAK
8
Suspends character transmission and places the transmission line in a break state until the ClearCommBreak function is called (or EscapeCommFunction is called with the CLRBREAK extended function code). The SETBREAK extended function code is identical to the SetCommBreak function. Note that this extended function does not flush data that has not been transmitted.
SETDTR
5
Sends the DTR (data-terminal-ready) signal.
SETRTS
3
Sends the RTS (request-to-send) signal.
SETXOFF
1
Causes transmission to act as if an XOFF character has been received.
SETXON
2
Causes transmission to act as if an XON character has been received.


ExitProcess

MSDN
1 つのプロセスと、そのプロセスに所属するすべてのスレッドを終了させます。
VOID ExitProcess(
  UINT uExitCode   // すべてのスレッドに適用される終了コード
);

ExitThread

MSDN
1 つのスレッドを終了させます。
VOID ExitThread(
  DWORD dwExitCode   // このスレッドの終了コード
);

明示的に ExitThread() 関数を呼び出さなくてもスレッド関数が終了すれば、自動的に ExitThread() が呼び出される

GetCommConfig

通信デバイスの現在の構成を取得します。
BOOL GetCommConfig(
  HANDLE hCommDev,    // 通信サービスのハンドル
  LPCOMMCONFIG lpCC,  // COMMCONFIG( 通信構成)構造体へのポインタ
  LPDWORD lpdwSize    // バッファサイズへのポインタ
);

GetCommMask

指定した通信デバイスのイベントマスクの値を取得します。
BOOL GetCommMask(
  HANDLE hFile,      // 通信デバイスのハンドル
  LPDWORD lpEvtMask  // イベントマスクを受け取る変数へのポインタ
);

GetCommModemStatus

MSDN
モデムの制御レジスタ値を取得します。
BOOL GetCommModemStatus(
  HANDLE hFile,        // 通信デバイスのハンドル
  LPDWORD lpModemStat  // 制御レジスタ値へのポインタ
);
lpModemStat
定数意味
MS_CTS_ONCTS( 送信可)信号がオンです。
MS_DSR_ONDSR( データセットレディ)信号がオンです。
MS_RING_ON呼び出し信号がオンです。
MS_RLSD_ONRLSD( 受信線信号検出)信号がオンです。

GetCommProperties

MSDN
指定した通信デバイスの通信プロパティの情報をバッファに入れます。
BOOL GetCommProperties(
  HANDLE hFile,           // 通信デバイスのハンドル
  LPCOMMPROP lpCommProp   // ( 通信プロパティ)構造体へのポインタ
);

COMMPROP

GetCommState

指定した通信デバイスの現在の制御設定をデバイス制御ブロック(DCB 構造体)に格納します。
BOOL GetCommState(
  HANDLE hFile,  // 通信デバイスのハンドル
  LPDCB lpDCB    // DCB( デバイス制御ブロック)構造体へのポインタ
);

GetCommTimeouts

指定した通信デバイスで実行されるすべての読み書き操作のタイムアウトパラメータを取得します。
BOOL GetCommTimeouts(
  HANDLE hFile,                  // 通信デバイスのハンドル
  LPCOMMTIMEOUTS lpCommTimeouts  // COMMTIMEOUTS( 通信タイムアウト)構造体
                                       // へのポインタ
);

GetDefaultCommConfig

通信デバイスの既定の構成を取得します。
BOOL GetDefaultCommConfig(
  LPCSTR lpszName,    // デバイス名の文字列へのポインタ
  LPCOMMCONFIG lpCC,  // 構造体を受け取るバッファへのポインタ
  LPDWORD lpdwSize    // バッファサイズへのポインタ
);

GetExitCodeThread

MSDN
指定されたスレッドの終了ステータスを取得します。
BOOL GetExitCodeThread(
  HANDLE hThread,      // スレッドのハンドル
  LPDWORD lpExitCode   // 終了ステータス
);
指定したスレッドが終了していない場合、STILL_ACTIVE が格納されます。
スレッドが既に終了した場合は、終了ステータスとして次のいずれかが格納されます。
  • ExitThread または TerminateThread 関数で指定した終了コード。
  • スレッド関数の戻り値。
  • スレッドが所属しているプロセスの終了コード。

PurgeComm

MSDN
指定した通信資源の出力バッファまたは入力バッファにあるすべての文字を破棄します。未処理の読み取り操作または書き込み操作を中止することもできます。
BOOL PurgeComm(
  HANDLE hFile,  // 通信資源のハンドル
  DWORD dwFlags  // 実行する操作
);

ReadFile

MSDN
ファイルからデータを読み取ります。ファイルポインタの現在の位置が、読み取りの開始位置になります。読み取りが完了すると、ファイルポインタの位置は、実際に読み取ったバイト数だけ進みます。ただし、オーバーラップ I/O(非同期 I/O)を指定してファイルのハンドルを作成した場合は、読み取り操作が完了した後、アプリケーション側でファイルポインタを調整してください。この関数は、同期と非同期両方の操作を想定して設計されています。一方、ReadFileEx 関数は、非同期操作専用に設計されています。そして、アプリケーションはファイルの読み取り操作を行っている間に、他の処理を実行できます。
BOOL ReadFile(
  HANDLE hFile,                // ファイルのハンドル
  LPVOID lpBuffer,             // データバッファ
  DWORD nNumberOfBytesToRead,  // 読み取り対象のバイト数
  LPDWORD lpNumberOfBytesRead, // 読み取ったバイト数
  LPOVERLAPPED lpOverlapped    // オーバーラップ構造体のバッファ
);

ReadFileEx

MSDN
ファイルからデータを非同期的に読み取ります。ReadFile 関数は同期と非同期の両方の操作を想定して設計されていますが、ReadFileEx 関数は非同期の操作だけを想定して設計されています。ReadFileEx 関数を使うと、アプリケーションはファイルの読み取り操作を行っている間に、他の処理を実行できます。

読み取り操作が完了または取り消された時点で、呼び出し側スレッドがアラート可能な待機状態になっている場合、ReadFileEx 関数は指定の完了ルーチンを呼び出して、完了のステータスを非同期で報告します。
BOOL ReadFileEx(
  HANDLE hFile,                                       // ファイルのハンドル
  LPVOID lpBuffer,                                    // データバッファ
  DWORD nNumberOfBytesToRead,                         // 読み取り対象のバイト数
  LPOVERLAPPED lpOverlapped,                          // オフセット
  LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // 完了ルーチン
);

SetCommBreak

指定した通信デバイスの文字送信を中断し、ClearCommBreak 関数が呼び出されるまで送信回線を切断状態にします。
BOOL SetCommBreak(
  HANDLE hFile   // 通信デバイスのハンドル
);

SetCommConfig

通信デバイスの現在の構成を設定します。
BOOL SetCommConfig(
  HANDLE hCommDev,    // 通信デバイスのハンドル
  LPCOMMCONFIG lpCC,  // COMMCONFIG( 通信構成)構造体へのポインタ
  DWORD dwSize        // 構造体のサイズ
);

SetCommMask

特定の通信デバイスで監視する一連のイベントを指定します。
BOOL SetCommMask(
  HANDLE hFile,    // 通信デバイスのハンドル
  DWORD dwEvtMask  // 監視するイベントを示すマスク
);

SetCommState

デバイス制御ブロック(DCB 構造体)の指定に従って通信デバイスを構成します。ハードウェアと制御の設定をすべて初期化しますが、出力待ち行列と入力待ち行列は空にしません。
BOOL SetCommState(
  HANDLE hFile,  // 通信デバイスのハンドル
  LPDCB lpDCB    // DCB( デバイス制御ブロック)構造体へのポインタ
);

SetCommTimeouts

指定した通信デバイスで実行されるすべての読み書き操作のタイムアウトパラメータを設定します。
BOOL SetCommTimeouts(
  HANDLE hFile,                  // 通信デバイスのハンドル
  LPCOMMTIMEOUTS lpCommTimeouts  // COMMTIMEOUTS( 通信タイムアウト)構造体
                                       // へのポインタ
);

[[COMMTIMEOUTS>#COMMTIMEOUTS]]

SetDefaultCommConfig

通信デバイスの既定の構成を設定します。
BOOL SetDefaultCommConfig(
  LPCSTR lpszName,    // デバイス名の文字列へのポインタ
  LPCOMMCONFIG lpCC,  // 構造体へのポインタ
  DWORD dwSize        // 構造体のサイズ
);

SetEvent

MSDN
指定されたオブジェクトをシグナル状態に設定します。
BOOL SetEvent(
  HANDLE hEvent   // イベントオブジェクトのハンドル
);

SetupComm

MSDN
指定した通信デバイスの通信パラメータを初期化します。
BOOL SetupComm(
  HANDLE hFile,     // 通信デバイスのハンドル
  DWORD dwInQueue,  // 入力バッファのサイズ
  DWORD dwOutQueue  // 出力バッファのサイズ
);

TransmitCommChar

指定した通信デバイスの出力バッファにある未処理のデータより前に、特定の文字を送信します。
BOOL TransmitCommChar(
  HANDLE hFile,  // 通信デバイスのハンドル
  char cChar     // 送信する文字
);

WaitCommEvent

MSDN
指定した通信デバイスでイベントが発生するのを待機します。この関数で監視するイベントは、デバイスのハンドルに関連付けられているイベントマスクによって示されます。
BOOL WaitCommEvent(
  HANDLE hFile,                // 通信デバイスのハンドル
  LPDWORD lpEvtMask,           // イベントを受け取る変数へのポインタ
  LPOVERLAPPED lpOverlapped,   // OVERLAPPED 構造体へのポインタ
);
lpOverlapped
OVERLAPPED 構造体へのポインタを指定します。hFile パラメータが示すデバイスを開くときに FILE_FLAG_OVERLAPPED フラグをセットした場合はこの構造体が必要になります。
hFile を開くときに FILE_FLAG_OVERLAPPED フラグをセットした場合は、lpOverlapped パラメータには有効な OVERLAPPED 構造体へのポインタを渡さなければなりません。NULL を渡すと、関数が操作の完了を誤って報告することがあります。

hFile を開くときに FILE_FLAG_OVERLAPPED フラグをセットして、lpOverlapped に NULL 以外のポインタを渡すと、WaitCommEvent 関数は重複操作として実行されます。このとき、OVERLAPPED 構造体に手動リセットイベントオブジェクト(CreateEvent 関数を使って作成します)のハンドルを指定しておく必要があります

hFile を開くときに FILE_FLAG_OVERLAPPED フラグをセットしなかった場合は、監視対象のイベントのいずれかが発生するか、エラーが発生するまで制御が戻りません。

解説
WaitCommEvent 関数は、指定された通信資源で一連のイベントを監視します。
通信資源の現在のイベントマスクを設定、取得する場合は、それぞれ SetCommMask 関数と GetCommMask 関数を使います。
重複操作をただちに完了できない場合、この関数は FALSE を返し、GetLastError 関数が ERROR_IO_PENDING を返します。
この値は、操作がバックグラウンドで実行中であることを示します。
さらに、WaitCommEvent 関数が制御を返す前に、システムが OVERLAPPED 構造体の hEvent メンバを非シグナル状態に設定します。
監視状態のイベントまたはエラーが起こると、設定がシグナル状態に変わります。
呼び出し側のプロセスはいずれかの待機関数を使ってイベントオブジェクトの状態を調べた後、GetOverlappedResult 関数を使って WaitCommEvent の結果を調べることができます。
GetOverlappedResult 関数は操作が成功したか失敗したかを報告し、lpEvtMask パラメータが示す変数が、発生したイベントを示す値に設定されます。
WaitCommEvent の重複操作の実行中にプロセスが SetCommMask 関数を使ってデバイスのハンドルに対応するイベントマスクを変更しようとすると、WaitCommEvent 関数はただちに制御を戻します。
このとき、lpEvtMask パラメータの示す変数は 0 に設定されます。


WaitForMultipleObjects

MSDN
次のいずれかが成立すると、制御を返します。
  • 指定されたオブジェクトの 1 つまたはすべてがシグナル状態になった。
  • タイムアウト時間が経過した。
アラート可能な待機状態に入るには、WaitForMultipleObjectsEx 関数を使います。
DWORD WaitForMultipleObjects(
  DWORD nCount,             // 配列内のハンドルの数
  CONST HANDLE *lpHandles,  // オブジェクトハンドルからなる配列
  BOOL fWaitAll,            // 待機オプション
  DWORD dwMilliseconds      // タイムアウト時間
);
fWaitAll
待機のタイプを指定します。TRUE を指定すると、lpHandles 配列内のすべてのオブジェクトがシグナル状態になったときに制御が返ります。FALSE を指定すると、lpHandles 配列内のオブジェクトのどれか 1 つがシグナル状態になったときに制御が返ります。この場合、戻り値は、関数が制御を返す状況をもたらした(つまり、シグナル状態になった)オブジェクトを表します。

WriteFile

ファイルにデータを書き込みます。この関数は、同期と非同期両方の操作を想定して設計されています。ファイルポインタの現在の位置が、書き込みの開始位置になります。書き込みが完了すると、ファイルポインタの位置は、実際に書き込んだバイト数だけ進みます。FILE_FLAG_OVERLAPPED を指定してファイルを開いた場合は、この限りではありません。オーバーラップ I/O(非同期 I/O)を指定してファイルのハンドルを作成した場合は、アプリケーション側でファイルポインタを調整してください。この関数は、同期と非同期両方の操作を想定して設計されています。一方、WriteFileEx 関数は、非同期操作専用に設計されています。そして、アプリケーションはファイルの書き込み操作を行っている間に、他の処理を実行できます。
BOOL WriteFile(
  HANDLE hFile,                    // ファイルのハンドル
  LPCVOID lpBuffer,                // データバッファ
  DWORD nNumberOfBytesToWrite,     // 書き込み対象のバイト数
  LPDWORD lpNumberOfBytesWritten,  // 書き込んだバイト数
  LPOVERLAPPED lpOverlapped        // オーバーラップ構造体のバッファ
);

Win32 Structures

COMMPROP

typedef struct _COMMPROP {
  WORD wPacketLength;// 構造体サイズ
  WORD wPacketVersion;// 構造体バージョン
  DWORD dwServiceMask;//プロバイダーからのサービス
  DWORD dwReserved1;//予約 使用禁止
  DWORD dwMaxTxQueue;//最大送信バッファーサイズ(バイト)
  DWORD dwMaxRxQueue;//最大受信バッファーサイズ(バイト)
  DWORD dwMaxBaud;//最大通信速度
  DWORD dwProvSubType;//通信方式
  DWORD dwProvCapabilities;//通信可能な通信方式
  DWORD dwSettableParams;//設定可能パラメータ
  DWORD dwSettableBaud;//設定可能最大通信速度
  WORD wSettableData;//設定可能なデータサイズ
  WORD wSettableStopParity;//設定可能なストップビット&パリティも種類
  DWORD dwCurrentTxQueue;//ドライバーの内部送信バッファーサイズ(バイト)
  DWORD dwCurrentRxQueue;//ドライバーの内部受信バッファーサイズ(バイト)
  DWORD dwProvSpec1;//プロバイダー用
  DWORD dwProvSpec2;//プロバイダー用
  WCHAR wcProvChar[1];//プロバイダー用
} COMMPROP;

COMMTIMEOUTS

typedef struct _COMMTIMEOUTS {
  DWORD ReadIntervalTimeout;//文字読込時、1文字あたりのタイムアウトまでの待ち時間(msec)
  DWORD ReadTotalTimeoutMultiplier;//トータル文字読み込み時間計算に使用される1文字あたりの待ち時間(msec)
  DWORD ReadTotalTimeoutConstant;//トータル文字読み込み時間計算に使用される待ち時間(msec)~~受信トータルタイムアウト(msec) = ReadTotalTimeoutMultiplier * (受信予定バイト数) +ReadTotalTimeoutConstant
  DWORD WriteTotalTimeoutMultiplier;//トータル文字書き込み時間計算に使用される1文字あたりの待ち時間
  DWORD WriteTotalTimeoutConstant;//トータル文字書込み時間計算に使用される待ち時間(msec)~~送信トータルタイムアウト(msec) = ReadTotalTimeoutMultiplier * (送信予定バイト数) +ReadTotalTimeoutConstant
} COMMTIMEOUTS;

COMSTAT

typedef struct _COMSTAT {
  DWORD fCtsHold :1;//CTS入力信号検出 TRUE→CTS 信号active検出により送信待機中
  DWORD fDsrHold :1;//DSR入力信号検出 TRUE→DSR 信号active検出により送信待機中
  DWORD fRlsdHold :1;//RLSD入力信号検出 TRUE→RLSD信号active検出により送信待機中
  DWORD fXoffHold :1;//Xoff入力信号検出 TRUE→Xoff信号検出済により送信待機中
  DWORD fXoffSent :1;//Xoff信号送信  TRUE→Xoff信号送信済み
  DWORD fEof :1;//EOF信号送信  TRUE→EOF 信号送信済み
  DWORD fTxim :1;//送信待ち     TRUE→送信待ちデータ有
  DWORD fReserved :25;//予約済み 使用禁止
  DWORD cbInQue; //受信バッファー内にある読まれていないデータ数(バイト)
  DWORD cbOutQue; //送信バッファー内にある送信されていないデータ数(バイト)
} COMSTAT;

DCB

typedef struct _DCB {
  DWORD DCBlength;//構造体のサイズ
  DWORD BaudRate;//通信速度
  DWORD fBinary :1;//バイナリーモード有効/無効
  DWORD fParity :1;//パリティチェック 有(報告付)/無 
  DWORD fOutxCtsFlow :1;//CTS入力信号監視 有効/無効→ハードウェアCTSフロー制御の有無
  DWORD fOutxDsrFlow :1;//DSR入力信号監視 有効/無効→ハードウェアDSRフロー制御の有無
  DWORD fDtrControl :2;//DTR制御方式の指定
  DWORD fDsrSensitivity :1;//DSRの状態に対する感度設定
  DWORD fTXContinueOnXoff :1;//通信相手の受信バッファーがFULL状態でXoffCharが送られてきた時の送信継続/中止設定(ソフトウェアフロー制御時)
  DWORD fOutX :1;// 送信のソフトウェアフロー制御設定 有効/無効
  DWORD fInX :1;// 受信のソフトウェアフロー制御設定 有効/無効
  DWORD fErrorChar :1;//パリティエラー検出時ErrorCharと置換するか否かの設定
  DWORD fNull :1;//NULL(0x00)を受信した時破棄するか否かの設定
  DWORD fRtsControl :2; //RTS出力信号制御 有/無 及び 制御方式設定
  DWORD fAbortOnError :1;//エラー発生時の送受信 停止/継続設定
  DWORD fDummy2 :17;//予約済 使用禁止
  WORD wReserved;// 予約済 0に設定のこと
  WORD XonLim;//Xon文字を送って受信を再開する最小入力バッファー容量(バイト数)
  WORD XoffLim;//Xoff文字を送って受信を停止する最大の入力バッファー容量(バイト数)
  BYTE ByteSize;//送受信するデータのビット数
  BYTE Parity;//送受信するデータに対して、パリティの有無、種類の設定
  BYTE StopBits;//送受信するデータのストップビットの数
  char XonChar;//ソフトウェア制御時のXon文字設定
  char XoffChar;//ソフトウェア制御時のXoff文字設定
  char ErrorChar;//パリティエラー発生時エラー文字と置換される文字の設定
  char EofChar;//データ信号の前にヘッダーとして最初につけられる文字の指定
  char EvtChar;//イベント用としてもちいられる文字の指定
  WORD wReserved1;//予約済 使用禁止
} DCB;

modemdevcaps_tag

typedef struct modemdevcaps_tag {
  DWORD dwActualSize;
  DWORD dwRequiredSize;
  DWORD dwDevSpecificOffset;
  DWORD dwDevSpecificSize;
  DWORD dwModemProviderVersion;
  DWORD dwModemManufacturerOffset;
  DWORD dwModemManufacturerSize;
  DWORD dwModemModelOffset;
  DWORD dwModemModelSize;
  DWORD dwModemVersionOffset;
  DWORD dwModemVersionSize;
  DWORD dwDialOptions;
  DWORD dwCallSetupFailTimer;
  DWORD dwInactivityTimeout;
  DWORD dwSpeakerVolume;
  DWORD dwSpeakerMode;
  DWORD dwModemOptions;
  DWORD dwMaxDTERate;
  DWORD dwMaxDCERate;
 BYTE abVariablePortion[1];
} MODEMDEVCAPS;

modemsettings_tag

typedef struct modemsettings_tag {
DWORD dwActualSize;
DWORD dwRequiredSize;
DWORD dwDevSpecificOffset;
DWORD dwDevSpecificSize;
DWORD dwCallSetupFailTimer;
DWORD dwInactivityTimeout;
DWORD dwSpeakerVolume;
DWORD dwSpeakerMode;
DWORD dwPreferredModemOptions;
DWORD dwNegotiatedModemOptions;
DWORD dwNegotiatedDCERate;
BYTE abVariablePortion[1]; } MODEMSETTINGS;

OVERLAPPED

typedef struct _OVERLAPPED {
  ULONG_PTR Internal;
  ULONG_PTR InternalHigh;
  union {
    struct {
      DWORD Offset;
      DWORD OffsetHigh;
    };
    PVOID  Pointer;
  };
  HANDLE    hEvent;
} OVERLAPPED, *LPOVERLAPPED;

COMMCONFIG

typedef struct _COMM_CONFIG {
  DWORD dwSize;
  WORD wVersion;
  WORD wReserved;
  DCB dcb;
  DWORD dwProviderSubType;
  DWORD dwProviderOffset;
  DWORD dwProviderSize;
  WCHAR wcProviderData[1];
} COMMCONFIG;

管理人/副管理人のみ編集できます