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

📄 serial.cpp

📁 一个密码小键盘的封装的动态库
💻 CPP
字号:
// Serial.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Serial.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

int RasEnumComDevices( COMDEVINFO *pComDevInfo,int *pnMaxSize,int *pnItem )
{
	HKEY hKEY;
	DWORD nStyle=REG_SZ;
	LPCTSTR path = "SOFTWARE\\Microsoft\\Ras\\Tapi Devices\\Unimodem";
	int nRet,nItem = 0,nSize,nPort;
	char address[256],name[1024],temp[MAX_DEVICE_NAME_LENGTH],*p1,*p2;
	nRet = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE,path,0,KEY_READ,&hKEY );
	if ( nRet == ERROR_SUCCESS )
	{
		memset( address,0,sizeof(address) );
		nSize = sizeof( address );
		nRet = ::RegQueryValueEx( hKEY,"Media Type",NULL,&nStyle,(unsigned char *)temp,(unsigned long *)&nSize);
		if ( stricmp( temp,"modem" ) == 0 )
		{
			nStyle = REG_MULTI_SZ;
			nSize = sizeof( address );
			nRet = ::RegQueryValueEx( hKEY,"Address",NULL,&nStyle,(unsigned char *)address,(unsigned long *)&nSize);
			if ( nRet == ERROR_SUCCESS )
			{
				nSize = sizeof(name);
				memset( name,0,sizeof(name) );
				::RegQueryValueEx( hKEY,"Friendly Name",NULL,&nStyle,(unsigned char *)name,(unsigned long *)&nSize);
				p1 = address;
				p2 = name;
				nSize = 0;
				nItem = 0;
				while ( *p1 )
				{
					if ( strnicmp( p1,"COM",3 ) == 0 )
					{
						nPort = atoi( p1+3 );
						if ( nPort > 0 )
						{
							nSize += sizeof( COMDEVINFO );
							if ( ( pComDevInfo != NULL ) && ( pnMaxSize == NULL || nSize <= *pnMaxSize ) )
							{
								pComDevInfo[nItem].nPort = nPort;
								memset( temp,0,sizeof(temp) );
								if ( p2 ) strncpy( temp,p2,sizeof(temp)-1 );
								else sprintf( temp,"标准调制解调器 (COM%d)",nPort );
								strncpy( pComDevInfo[nItem].cMediaName,temp,MAX_DEVICE_NAME_LENGTH-1 );
							}
							nItem ++;
						}
					}
					p1 += strlen(p1)+1;
					p2 += strlen(p2)+1;
				}
				if ( pnMaxSize ) *pnMaxSize = nSize;
				if ( pnItem ) *pnItem = nItem;
			}
		}
	}
	return nRet;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSerial::CSerial()
{
	m_hComDev = ( HANDLE ) -1;
	m_bOpened = FALSE;
	m_nBaud = 9600;
	m_nPort = 1;
}

CSerial::~CSerial()
{
	Close();
}

BOOL CSerial::Close()
{
	if ( 	m_hComDev != ( HANDLE )-1 ) CloseHandle( m_hComDev );
	m_hComDev = ( HANDLE )-1;
	m_bOpened = FALSE;
	return TRUE;
}

BOOL CSerial::IsOpened()
{
	return m_bOpened;
}

BOOL CSerial::Open(int nPort, unsigned long nBaud)
{
   DCB dcb;
	BOOL bSet = TRUE;
   COMMTIMEOUTS CommTimeOuts;
	char temp[32];
	if ( m_hComDev != (HANDLE)-1 ) return TRUE;
   if ( nPort ) m_nPort = nPort;
	if ( nBaud ) m_nBaud = nBaud;
	m_bOpened = FALSE;
	sprintf( temp,"COM%d",m_nPort );
	m_hComDev = CreateFile( temp,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL );
   if ( m_hComDev != ( HANDLE ) -1 )
	{
		bSet = SetupComm( m_hComDev,1024,1024 );
      if ( bSet ) bSet = GetCommState( m_hComDev,&dcb );
		if ( bSet )
		{
			dcb.fBinary  = 1;
			dcb.BaudRate = m_nBaud;
			dcb.ByteSize = DATABITS_8;
			dcb.Parity = NOPARITY;//0;
			dcb.StopBits = ONESTOPBIT;	//JKP521停止位为1 
			dcb.fParity = 0;
			dcb.fInX = 0;
			dcb.fOutX = 0;
			dcb.fOutxCtsFlow = 0;//1;
			dcb.fOutxDsrFlow = 0;//1;
			dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;//DTR_CONTROL_ENABLE;
			dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;//RTS_CONTROL_ENABLE;//
			dcb.fDsrSensitivity = 0;
			bSet = SetCommState( m_hComDev,&dcb );
		}
		if ( bSet )
		{
			CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
			CommTimeOuts.ReadTotalTimeoutConstant = 0;
			CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
			CommTimeOuts.WriteTotalTimeoutConstant = 1000;
			CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
			bSet = SetCommTimeouts( m_hComDev,&CommTimeOuts );
		}
		if ( bSet ) m_bOpened = TRUE;
		else
		{
			CloseHandle( m_hComDev );
			m_hComDev = ( HANDLE )-1;
		}
   }
	return m_bOpened;
}

int CSerial::Read(char *pData, int nMaxCount)
{
	int nCount =-1;
	if ( m_bOpened )
	{
		nCount = 0;
		ReadFile( m_hComDev,pData,nMaxCount,(unsigned long *)&nCount,NULL );
	}
	return nCount;
}

int CSerial::Write(const char *pData, int nLength)
{
	int nCount =-1;
	if ( m_bOpened )
	{
		nCount = 0;
		if ( nLength <= 0 ) nLength = strlen( pData );
		WriteFile( m_hComDev, pData, nLength, (unsigned long *)&nCount,NULL );
		Sleep(10);
		if (nCount < 1)
			TRACE("\n Read Error=[%d]", GetLastError());
	}
	return nCount;
}

BOOL CSerial::Flush()
{
	if ( !m_bOpened ) return FALSE;
	return FlushFileBuffers( m_hComDev );
}

int CSerial::GetStatus()
{
	int nStatus = 0;
	if ( m_bOpened )
	{
		GetCommModemStatus( m_hComDev,(unsigned long *)&nStatus );
	}
	return nStatus;
}

HANDLE CSerial::GetHandle()
{
	return m_hComDev;
}

⌨️ 快捷键说明

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