[kaze's test] プログラミングメモ →目次

シリアル通信(簡易版)(VC++)

RS232C Communication

1.シリアルのデバイスを開き、プロトコルを設定します。

例:ポート:"COM3"、ボーレート:19200で、8ビット、パリティ無し、1ストップ。

HANDLE hCom = INVALID_HANDLE_VALUE;
void CSimple232CDlg::OnButtonOpen() 
{
    hCom = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom == INVALID_HANDLE_VALUE) 
        return;

    DCB dcb;
    memset(&dcb, 0, sizeof(DCB));
    dcb.DCBlength = sizeof(DCB) ;
    dcb.BaudRate = CBR_19200;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    SetCommState(hCom, &dcb);
}


2.送信します。ファイルのライト処理と一緒です。 

例:

void CSimple232CDlg::OnButtonSend() 
{
    if (hCom != INVALID_HANDLE_VALUE)
    {
        CString strText = "Hello, RS232C.";
        DWORD dwBytes = 0;
        WriteFile(hCom, (LPCTSTR)strText, strText.GetLength(), &dwBytes, NULL);
    }
}

3.受信します。受信バッファに入っているデータのバイト数を調べてから、一発でファイルリードします。 例:

void CSimple232CDlg::OnButtonReceive() 
{
    if (hCom != INVALID_HANDLE_VALUE)
    {
        DWORD dwError;
        COMSTAT comStat;
        if (ClearCommError(hCom, &dwError, &comStat))
        {
            if (comStat.cbInQue)
            {
                char* buff = new char [comStat.cbInQue];
                DWORD NumberOfBytesRead = 0;
                if (ReadFile(hCom, buff, comStat.cbInQue, &NumberOfBytesRead, NULL))
                {
                    CString strText(buff, NumberOfBytesRead);
                    //ここで、受信を処理する
                    TRACE("Received: %s\r\n", strText);
                }
                delete [] buff;
            }
        }
    }
}
上の関数は、WM_TIMERのイベントハンドル関数に入れれば、周期的に受信できます。
void CSimple232CDlg::OnTimer(UINT nIDEvent) 
{
    OnButtonReceive();
    CDialog::OnTimer(nIDEvent);
}

4.シリアルのデバイスを開放します。

void CSimple232CDlg::OnButtonClose() 
{
    if (hCom != INVALID_HANDLE_VALUE)
    {
        CloseHandle(hCom);
        hCom = INVALID_HANDLE_VALUE;
    }
}