?? 說明.txt
字號:
函數說明:
InitCom是打開串口并進行初始化,在對串口進行其他操作前必須執行它(本例子在
OnInitDialog中調用它)。
InitCom的參數1是串口號,參數2表示波特率,例如:InitCom(1,CBR_9600)表示用COM1,9600波特率
ReadData是對串口進行讀操作
WriteData是對串口進行寫操作
WriteData的參數1是要發送的數據的指針,參數2是要發送的數據的長度。
這是串口編程的三個基本函數,具體什么時候調用ReadData,什么時候調用WriteData,由你自己決定,可以在ReadData中對所讀的數據進行分析。
在本例子中采用定時放式,每隔100毫秒對串口進行一次操作。
記得程序退出前要關閉串口。
/////////////////////////////////////////////////////////////
//打開并初始化串口
//參數com為串口號,baud為波特率。
BOOL CComRhDlg::InitCom(int com, DWORD baud)
{
COMMTIMEOUTS timeout;
DCB dcb;
BOOL result;
int temp=0;
char strCom[20] = "\\\\.\\com";
char buffer[20];
_itoa(com , buffer , 10);
strcat( strCom , buffer );
m_hCom = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, NULL , NULL);
if( m_hCom == INVALID_HANDLE_VALUE )
{
DWORD dwError = GetLastError();
if (dwError == ERROR_ACCESS_DENIED)//已經打開
{
AfxMessageBox( "端口已被占用!請退出程序" , MB_OK , 0 );
return FALSE;
}
AfxMessageBox( "端口不存在或已壞!請退出程序" , MB_OK , 0 );
return FALSE;
}
result=SetupComm( m_hCom , 512 , 512 );
ASSERT(result);
if(!result) return FALSE;
result = PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
ASSERT( result );
if( !result ) return FALSE;
result = GetCommState( m_hCom , &dcb );
ASSERT(result);
if(!result) return FALSE;
dcb.Parity = NOPARITY;
dcb.BaudRate = baud;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
result = SetCommState( m_hCom , &dcb );
ASSERT(result);
if(!result) return FALSE;
result=GetCommTimeouts( m_hCom , &timeout );
ASSERT(result);
if(!result) return FALSE;
timeout.ReadIntervalTimeout=MAXDWORD;
timeout.ReadTotalTimeoutMultiplier=0;
timeout.ReadTotalTimeoutConstant=0;
timeout.WriteTotalTimeoutMultiplier=0;
timeout.WriteTotalTimeoutConstant=0;
result=SetCommTimeouts( m_hCom , &timeout );
ASSERT(result);
if(!result) return FALSE;
return TRUE;
}
//////////////////////////////////////////////
//讀取串口數據,并判斷所讀的數據
//然后調用WriteData函數,將數據發送到串口。
void CComRhDlg::ReadData()
{
if(m_hCom == INVALID_HANDLE_VALUE)
return;
DWORD nRead = 0;
BYTE recBuf[512];//接收數據緩沖區
memset(recBuf, 0, sizeof(recBuf));
BYTE sendBuf[512];//發送數據緩沖區
memset(sendBuf, 0, sizeof(sendBuf));
PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
ReadFile( m_hCom , (char *)recBuf , 512 ,&nRead , NULL);//讀串口
if(nRead != 0)
{
///////////////////////////////////////////////////////////
//下面是對收到的數據進行分析,然后確定發送的內容
//發送內容放到sendBuf中,
if(recBuf[0] == 0x06)
{
sendBuf[0] = 0x15;
WriteData((char *)sendBuf, 1);
}
// else if( (recBuf[0] == 0x53)
// && (recBuf[1] = 0x55)
// .... )
// {
// ....
// ....
// }
///////////////////////////////////////////////////////////
}
}
/////////////////////////////////////////////////////////////
//串口寫操作
//將長度為len的tmpStr發到串口上。
void CComRhDlg::WriteData(char *tmpStr, int len)
{
if(m_hCom == INVALID_HANDLE_VALUE)
return;
DWORD nWrite = 0;
PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
Sleep(100);
WriteFile(m_hCom, tmpStr, len , &nWrite, NULL);//寫串口
if(nWrite != len)
{
AfxMessageBox("寫數據失敗!");
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -