⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.cpp

📁 serial.h serial.cpp 共两个文件
💻 CPP
字号:
# include	"stdafx.h"
# include	"serial.h"

CSerial::CSerial():m_hPort(INVALID_HANDLE_VALUE)
{
//	static int nCount(0);
//	 ++nCount;

//	ASSERT( nCount == 1);
}

CSerial::~CSerial()
{
    Close();
}
void    CSerial::Close()
{
	if(m_hPort != INVALID_HANDLE_VALUE)
		ClosePort(m_hPort);
    m_hPort = INVALID_HANDLE_VALUE;
}
BOOL	CSerial::IsOpen()
{

	return (m_hPort != INVALID_HANDLE_VALUE)?TRUE:FALSE;
}



BOOL CSerial::OpenPort(int nCOM, int  BaudRate )
{
	if(m_hPort!=INVALID_HANDLE_VALUE)
		return FALSE;
	
	char *strCOM[]={ "COM1", "COM2", "COM3", "COM4" };

    m_hPort = CreateFile(strCOM[nCOM],  // Specify port device: default "COM1"
        GENERIC_READ | GENERIC_WRITE,       // Specify mode that open device.
        0,                                  // the devide isn't shared.
        NULL,                               // the object gets a default security.
        OPEN_EXISTING,                      // Specify which action to take on file.
        0,                                  // default.
        NULL);                              // default.
	
    if( m_hPort == INVALID_HANDLE_VALUE )
        return FALSE;
	
    // Get current configuration of serial communication port.
    DCB config_;
    GetCommState(m_hPort,&config_);
    // Assign user parameter.
	config_.ByteSize = 8;            // Byte of the Data.
	config_.StopBits = ONESTOPBIT;   // Use one bit for stopbit.
	config_.Parity = NOPARITY;       // No parity bit
	config_.BaudRate = BaudRate;//CBR_9600;     // Buadrate 9600 bit/sec
	
    // Set current configuration of serial communication port.
    if (SetCommState(m_hPort,&config_) == 0)
    {
		return FALSE;
    }
//		_co.ReadIntervalTimeout = 0xFFFFFFFF;
//		_co.ReadTotalTimeoutMultiplier = 0;
//		_co.ReadTotalTimeoutConstant = 0;
//		_co.WriteTotalTimeoutMultiplier = 0;
//		_co.WriteTotalTimeoutConstant = 5000;
	
    // instance an object of COMMTIMEOUTS.
    COMMTIMEOUTS comTimeOut;                   
    // Specify time-out between charactor for receiving.
    comTimeOut.ReadIntervalTimeout = 3;//0xffffffff;
    // Specify value that is multiplied 
    // by the requested number of bytes to be read. 
    comTimeOut.ReadTotalTimeoutMultiplier = 3;//0;
    // Specify value is added to the product of the 
    // ReadTotalTimeoutMultiplier member
    comTimeOut.ReadTotalTimeoutConstant = 2;//0;
    // Specify value that is multiplied 
    // by the requested number of bytes to be sent. 
    comTimeOut.WriteTotalTimeoutMultiplier = 3;//0;
    // Specify value is added to the product of the 
    // WriteTotalTimeoutMultiplier member
    comTimeOut.WriteTotalTimeoutConstant = 2;//5000;
    // set the time-out parameter into device control.
    SetCommTimeouts(m_hPort,&comTimeOut);
    // Updata port's status.

	SetupComm( m_hPort, 8192, 8192 );	//设置推荐缓冲区
//
	PurgeComm( m_hPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );	//清空串口缓冲区

	return TRUE;
}
DWORD CSerial::ReadPort( TCHAR *buf )
{
    if( m_hPort == INVALID_HANDLE_VALUE )  return 0;

	BOOL fReadState;
	DWORD dwLength(0);

/*
	COMSTAT  stat;
	DWORD error;

	if(ClearCommError(m_hPort, &error, &stat) && error > 0)	//清除错误
	{
		PurgeComm(m_hPort, PURGE_RXABORT | PURGE_RXCLEAR); //清除输入缓冲区
		return 0;
	}
//*/
//	OVERLAPPED _ro; //	重叠I/O
    fReadState=ReadFile(m_hPort,buf,0x40,&dwLength,NULL);//&_ro);
	if(!fReadState)
	{//不能从串口读取数据
		return 0;
	}
	else
	{//把数据赋值给全局变量
        if( dwLength > 0 )
            buf[dwLength]=NULL;
        return dwLength;
    }

}
int     CSerial::Send( TCHAR *buf )
{
    return WritePort( buf, strlen(buf));
}

DWORD CSerial::WritePort(TCHAR *buf,DWORD dwCharToWrite)
{
	if( m_hPort == INVALID_HANDLE_VALUE )
		return 0;

//	DWORD    error;
//	if(ClearCommError(m_hPort, &error, NULL) && error > 0)	//清除错误
//		PurgeComm(m_hPort, PURGE_TXABORT | PURGE_TXCLEAR);


	BOOL fWriteState;
	DWORD dwBytesWritten(dwCharToWrite);

	//写入数据
	//OVERLAPPED _wr; //	重叠I/O
	fWriteState=WriteFile(m_hPort,buf,dwCharToWrite*sizeof(TCHAR),&dwBytesWritten, NULL);//&_wr);
	if(!fWriteState)//不能写数据
		dwBytesWritten=0;
	return dwBytesWritten;
}

BOOL CSerial::ClosePort(HANDLE & hCommPort)
{
	if (hCommPort != INVALID_HANDLE_VALUE)
	{
		//设置连接属性为FALSE
		CloseHandle (hCommPort);
		hCommPort = INVALID_HANDLE_VALUE;
		return TRUE;
	}
	else
	{
		return TRUE;
	}
}

void CSerial::ClearBuffer()
{
    char buf[0x40];
	memset( buf, NULL, 0x40);
    while( ReadPort(buf) > 0 );

}

int		CSerial::Filter( char *buf, char *buffer, int nMax )
{//过滤有效字符
	char c;
	int k(0);
	memset( buf, NULL, nMax );

	for( int j(0); j<nMax; j++){
		c = buffer[j];
		if( (c >='0'&& c<='9' ) ||
			( c >='A' && c <= 'z' ) || c == '-' || c == '.' || c == ',' )
		{
			
			buf[k++] = c;
		}
		else if( c == '\n' || c == '\r' )//结束符
		{
		}
		else
			break;
	}
	if(k)buf[k++]=0x0a;
	buf[k]=NULL;
	return k;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -