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