シリアル通信 (Serial communication)

ポートを開く

CreateFile()で開きます。

通信設定

BOOL GetCommState(
  HANDLE hFile,  // 通信デバイスのハンドル
  LPDCB lpDCB    // DCB(デバイス制御ブロック)構造体へのポインタ
  );
GetCommState 関数 | MSDN
BOOL SetCommState(
  HANDLE hFile,  // 通信デバイスのハンドル
  LPDCB lpDCB    // DCB(デバイス制御ブロック)構造体へのポインタ
  );
SetCommState 関数 | MSDN

DCB構造体

typedef struct _DCB {
  DWORD DCBlength;
  DWORD BaudRate;
  DWORD fBinary  :1;
  DWORD fParity  :1;
  DWORD fOutxCtsFlow  :1;
  DWORD fOutxDsrFlow  :1;
  DWORD fDtrControl  :2;
  DWORD fDsrSensitivity  :1;
  DWORD fTXContinueOnXoff  :1;
  DWORD fOutX  :1;
  DWORD fInX  :1;
  DWORD fErrorChar  :1;
  DWORD fNull  :1;
  DWORD fRtsControl  :2;
  DWORD fAbortOnError  :1;
  DWORD fDummy2  :17;
  WORD  wReserved;
  WORD  XonLim;
  WORD  XoffLim;
  BYTE  ByteSize;
  BYTE  Parity;
  BYTE  StopBits;
  char  XonChar;
  char  XoffChar;
  char  ErrorChar;
  char  EofChar;
  char  EvtChar;
  WORD  wReserved1;
} DCB, *LPDCB;
DCB structure (Windows) | MSDN

タイムアウトの設定

BOOL SetCommTimeouts(
  HANDLE hFile,                  // 通信デバイスのハンドル
  LPCOMMTIMEOUTS lpCommTimeouts  // COMMTIMEOUTS( 通信タイムアウト)構造体へのポインタ
  );
SetCommTimeouts 関数 | MSDN

COMMTIMEOUTS構造体

typedef struct _COMMTIMEOUTS {
  DWORD ReadIntervalTimeout;
  DWORD ReadTotalTimeoutMultiplier;
  DWORD ReadTotalTimeoutConstant;
  DWORD WriteTotalTimeoutMultiplier;
  DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS, *LPCOMMTIMEOUTS;
COMMTIMEOUTS structure (Windows) | MSDN

送受信

送信

BOOL WriteFile(
  HANDLE hFile,                    // ファイルのハンドル
  LPCVOID lpBuffer,                // データバッファ
  DWORD nNumberOfBytesToWrite,     // 書き込み対象のバイト数
  LPDWORD lpNumberOfBytesWritten,  // 書き込んだバイト数
  LPOVERLAPPED lpOverlapped        // オーバーラップ構造体のバッファ
  );
WriteFile 関数 | MSDN

受信

BOOL ReadFile(
  HANDLE hFile,                // ファイルのハンドル
  LPVOID lpBuffer,             // データバッファ
  DWORD nNumberOfBytesToRead,  // 読み取り対象のバイト数
  LPDWORD lpNumberOfBytesRead, // 読み取ったバイト数
  LPOVERLAPPED lpOverlapped    // オーバーラップ構造体のバッファ
  );
ReadFile 関数 | MSDN

ポートを閉じる

BOOL CloseHandle(
  HANDLE hObject   // オブジェクトのハンドル
  );
CloseHandle 関数 | MSDN

サンプルコード

初期設定

HANDLE hComm; // ファイルのハンドラ

// ポートのオープン
hComm = CreateFile(
    "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

if( hComm == INVALID_HANDLE_VALUE ) return;

// 通信条件の設定
DCB lpDCB;
if( !GetCommState( hComm, &lpDCB ) ) return;

lpDCB.BaudRate = 115200;     // 転送速度の指定 (115200bps)
lpDCB.ByteSize = 8;          // ビット長の指定 (8bit)
lpDCB.Parity = NOPARITY;     // パリティ方式 (パリティなし)
lpDCB.StopBits = ONESTOPBIT; // ストップビット数の指定 (1bit)

lpDCB.fOutxCtsFlow = 0;      // 以下 フロー制御
lpDCB.fOutxDsrFlow = 0;
lpDCB.fDtrControl = 0;
lpDCB.fOutX = 0;
lpDCB.fInX = 0;
lpDCB.fRtsControl = 0;

if( !SetCommState( hComm, &lpDCB ) ) return;

// タイムアウトの設定
COMMTIMEOUTS lpCommTimeouts;

lpCommTimeouts.ReadIntervalTimeout = 500;       // 全文字の読み込み時間
lpCommTimeouts.ReadTotalTimeoutMultiplier = 0;  // 読み込みの1文字あたりの待ち時間
lpCommTimeouts.ReadTotalTimeoutConstant = 500;  // 読み込みエラー検出用のタイムアウト時間
lpCommTimeouts.WriteTotalTimeoutMultiplier = 0; // 書き込みの1文字あたりの待ち時間
lpCommTimeouts.WriteTotalTimeoutConstant = 0;   // 書き込みエラー検出用のタイムアウト時間

if( !SetCommTimeouts( hComm, &lpCommTimeouts ) ) return;
Microsoft Learnから検索