シリアルポート(COMポート)の操作方法




近頃はLANが流行りの為か、シリアルポートで通信を実現しようと思って、本を探しても、 ほとんど書いてある本はありません。
実際に一番詳しく説明がされていたのはVCのヘルプであるMSDNだったりします。
しかし、こいつは肝心要なところが英語になっていたりする。
そういうわけで、決して詳しくはありませんが(詳しく書こうにも理解できていない)、 とりあえずは動いた手順を紹介します。

1.オープンはCreateFile()関数、クローズはCloseHandle()関数で行う。
CreateFile()関数の第一引数のファイル名に"COM1"とか"COM2"とか記述すれば、 シリアルポートのオープンができます。
(File:COMMcommopen.cpp)
    //-----------------------------------------------------------------------------
    /// 通信ポートオープン処理
    //-----------------------------------------------------------------------------

    // ポートハンドラ初期化
    Com2Port = INVALID_HANDLE_VALUE;
    // 通信ポートオープン
    com2Port = CreateFile( "COM2",                        // COM2ポート
                           GENERIC_READ | GENERIC_WRITE,  // READ&WRITE
                           0,
                           NULL,
                           OPEN_EXISTING,
                           FILE_FLAG_OVERLAPPED,          // 非同期モード
                           NULL );
    //オープンエラーの時
    if( Com2Port == INVALID_HANDLE_VALUE )
    {
    // エラーでリターンする
    return( FALSE );
}
最初にポートハンドラを初期化しているのは、別関数で、ポートがオープン済みかどうかを チェックする為です。
第六引数の非同期モードは、読み込みや書き込みの処理が終了していなくても、すぐに 読み書き関数をリターンさせたい場合に指定します。
非同期の設定は面倒なので、また別の機会に説明すると思います。
二重オープンでもしない限り、CreateFileでエラーになることは、まず無いと思います。

(File:COMMcommclose.cpp)
    // 通信ポートをクローズする
    Bool_Ret = CloseHandle( Com2Port );
    // ポートハンドラを初期化する
    Com2Port = INVALID_HANDLE_VALUE;

    // クローズエラーの時
    if( Bool_Ret == 0 )
    {
    // ソケットがオープン中かチェック
    if( E_Socket != NULL )
    {
        // 内部ログの書き込み
        (long)(*ZZerrlog_VC)( E_Socket, NHK_COM_COMM, "%s %s %d %s(%d)", 0,
                              PRCNAM_COM, __file__, __line__, D_LOG_MSG08, GetLastError() );
    }

    // エラーでリターンする
    return( FALSE );
}
2.ポートの設定を変更する
ポートのオープンクローズが完了したら、次はポートの設定を行います。
(File:COMMcommopen.cpp)
    DCB        dcb;            // 通信設定構造体
    // 通信ポートの状態を取得する
    Bool_Ret = GetCommState( Com2Port, &dcb );

    // 通信ポートの設定を行う
    dcb.BaudRate = 9600;        // 通信速度:9600
    dcb.ByteSize = 8;           // データビット:8
    dcb.Parity = NOPARITY;      // パリティ:なし
    dcb.StopBit = ONESTOPBIT;   // スタートストップビット:

    // 通信ポート状態を更新する
    Bool_Ret = SetCommState( Com2Port, &dcb );


WinNTのコンパネにシリアルポートがあり、そこで通信設定を行っても、プログラム上 からオープンした場合はその内容は反映されませんでした。そのためにここで通信設定を 行っています。

3.読み書き
後はReadFile()関数とWriteFile()関数で送受信処理を追加するだけです。



N総研ソフトウェア開発部のTOPに戻る。

このページに関するご意見・質問は
ドンタコスN村 E-mail:wnaka@coco.ned.co.jp
まで送信してください。