?? comm.cpp
字號(hào):
#include "stdafx.h"
#include "Comm.h"
// 串口設(shè)備句柄
/*HANDLE hComm;
// 打開串口
// 輸入: pPort - 串口名稱或設(shè)備路徑,可用"COM1"或"\\.\COM1"兩種方式,建議用后者
// nBaudRate - 波特率
// nParity - 奇偶校驗(yàn)
// nByteSize - 數(shù)據(jù)字節(jié)寬度
// nStopBits - 停止位
BOOL OpenComm(const char* pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits)
{
DCB dcb; // 串口控制塊
COMMTIMEOUTS timeouts = { // 串口超時(shí)控制參數(shù)
1, // 讀字符間隔超時(shí)時(shí)間: 100 ms
1, // 讀操作時(shí)每字符的時(shí)間: 1 ms (n個(gè)字符總共為n ms)
10, // 基本的(額外的)讀超時(shí)時(shí)間: 500 ms
5, // 寫操作時(shí)每字符的時(shí)間: 1 ms (n個(gè)字符總共為n ms)
10}; // 基本的(額外的)寫超時(shí)時(shí)間: 100 ms
hComm = CreateFile(pPort, // 串口名稱或設(shè)備路徑
GENERIC_READ | GENERIC_WRITE, // 讀寫方式
0, // 共享方式:獨(dú)占
NULL, // 默認(rèn)的安全描述符
OPEN_EXISTING, // 創(chuàng)建方式
0, // 不需設(shè)置文件屬性
NULL); // 不需參照模板文件
if(hComm == INVALID_HANDLE_VALUE) return FALSE; // 打開串口失敗
GetCommState(hComm, &dcb); // 取DCB
dcb.BaudRate = nBaudRate;
dcb.ByteSize = nByteSize;
dcb.Parity = nParity;
dcb.StopBits = nStopBits;
SetCommState(hComm, &dcb); // 設(shè)置DCB
SetupComm(hComm, 4096, 1024); // 設(shè)置輸入輸出緩沖區(qū)大小
SetCommTimeouts(hComm, &timeouts); // 設(shè)置超時(shí)
return TRUE;
}
// 關(guān)閉串口
BOOL CloseComm()
{
return CloseHandle(hComm);
}
// 寫串口
// 輸入: pData - 待寫的數(shù)據(jù)緩沖區(qū)指針
// nLength - 待寫的數(shù)據(jù)長(zhǎng)度
// 返回: 實(shí)際寫入的數(shù)據(jù)長(zhǎng)度
int WriteComm(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口發(fā)出的數(shù)據(jù)長(zhǎng)度
WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);
return (int)dwNumWrite;
}
// 讀串口
// 輸入: pData - 待讀的數(shù)據(jù)緩沖區(qū)指針
// nLength - 待讀的最大數(shù)據(jù)長(zhǎng)度
// 返回: 實(shí)際讀出的數(shù)據(jù)長(zhǎng)度
int ReadComm(void* pData, int nLength)
{
DWORD dwNumRead; // 串口收到的數(shù)據(jù)長(zhǎng)度
ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);
return (int)dwNumRead;
}*/
CComm::CComm()
{
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
m_hIDComDev = NULL;
m_bOpened = FALSE;
}
CComm::~CComm()
{
Close();
}
BOOL CComm::Open( int nPort, int nBaud )
{
if( m_bOpened ) return( TRUE );
char szPort[15];
char szComParams[50];
DCB dcb;
wsprintf( szPort, "COM%d", nPort );
m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
if( m_hIDComDev == NULL ) return( FALSE );
memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 100;
CommTimeOuts.ReadTotalTimeoutConstant = 50;
CommTimeOuts.WriteTotalTimeoutMultiplier = 100;
CommTimeOuts.WriteTotalTimeoutConstant = 50000;
SetCommTimeouts( m_hIDComDev, &CommTimeOuts );
wsprintf( szComParams, "\\\\.\\COM%d:%d,n,8,1", nPort, nBaud );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
dcb.DCBlength = sizeof( DCB );
GetCommState( m_hIDComDev, &dcb );
dcb.BaudRate = nBaud;
dcb.ByteSize = 8;
unsigned char ucSet;
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_DTRDSR ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_RTSCTS ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_XONXOFF ) != 0 );
if( !SetCommState( m_hIDComDev, &dcb ) ||
!SetupComm( m_hIDComDev, 10000, 10000 ) ||
m_OverlappedRead.hEvent == NULL ||
m_OverlappedWrite.hEvent == NULL ){
DWORD dwError = GetLastError();
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( m_hIDComDev );
return( FALSE );
}
m_bOpened = TRUE;
return( m_bOpened );
}
BOOL CComm::Close( void )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( TRUE );
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( m_hIDComDev );
m_bOpened = FALSE;
m_hIDComDev = NULL;
return( TRUE );
}
BOOL CComm::WriteCommByte( unsigned char ucByte )
{
BOOL bWriteStat;
DWORD dwBytesWritten;
bWriteStat = WriteFile( m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite );
if( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ) ){
if( WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ) ) dwBytesWritten = 0;
else{
GetOverlappedResult( m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE );
m_OverlappedWrite.Offset += dwBytesWritten;
}
}
return( TRUE );
}
int CComm::SendData( const char *buffer, int size )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
DWORD dwBytesWritten = 0;
int i;
for( i=0; i<size; i++ ){
WriteCommByte( buffer[i] );
dwBytesWritten++;
}
return( (int) dwBytesWritten );
}
int CComm::ReadDataWaiting( void )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
return( (int) ComStat.cbInQue );
}
int CComm::ReadData( void *buffer, int limit )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
if( !ComStat.cbInQue ) return( 0 );
dwBytesRead = (DWORD) ComStat.cbInQue;
if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;
bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
if( !bReadStatus ){
if( GetLastError() == ERROR_IO_PENDING ){
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return( (int) dwBytesRead );
}
return( 0 );
}
return( (int) dwBytesRead );
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -