SOFTIST 编程方法筆記 目録 

串行通信(簡易版)(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;
    }
}