シリアル通信(簡易版)(VC++) RS232C Communication 例:ポート:"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; } } |