?? serial.cpp
字號(hào):
// 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,"標(biāo)準(zhǔn)調(diào)制解調(diào)器 (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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -