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

📄 wio.cpp

📁 通过PC并口模拟I2C信号
💻 CPP
字号:
#include "stdafx.h"
#include "Wio.h"

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

//////////////////////////////////////////////////////////////////////
// 峔抸/徚柵
//////////////////////////////////////////////////////////////////////

CWio::CWio():
	m_hDLL(0),
	m_lpfnDllInitializeWinIo(0),
	m_lpfnDllShutdownWinIo(0),
	m_lpfnDllGetPortVal(0),
	m_lpfnDllSetPortVal(0),
	m_lpfnDllMapPhysToLin(0),
	m_lpfnDllUnmapPhysicalMemory(0),
	m_lpfnDllGetPhysLong(0),
	m_lpfnDllSetPhysLong(0),
	m_wDataPort(   0x378 ),
	m_wStatusPort( 0x379 )
{
}

CWio::~CWio()
{
	if ( m_hDLL != 0 ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
	}
}


//////////////////////////////////////////////////////////////////////
// Description
//		弶婜壔張棟
//		WinIo.DLL 傪摦揑偵儘乕僪偟偰丄
//		娭悢偺億僀儞僞傪妉摼偟偰偍偔
// In
//		側偟
// Out
//		側偟
// Return
//		== 0 : 惉岟
//		!= 0 : 僄儔乕
// Note
//		NT,2000 側傜暿搑丄僨僶僀僗僪儔僀僶傪撉傒崬傓娭悢傪僐乕儖
//		偟偰偄傞
//////////////////////////////////////////////////////////////////////
int CWio::Init()
{
	// Load Library
	m_hDLL = LoadLibrary( "WinIo.dll" );
	if ( m_hDLL == 0 ) {
//		::AfxMessageBox( "WinIo.dll not found." );
		return -1;
	}

	// Get ponter to function(s)
	// 1.
	m_lpfnDllInitializeWinIo = ( LPFNDLLINITIALIZEWINIO	)GetProcAddress( m_hDLL, "InitializeWinIo" );
	if ( !m_lpfnDllInitializeWinIo ) {
		// handle error
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"InitializeWinIo\" )\n", m_hDLL );
		return -1;
	}	

	// 2.
	m_lpfnDllShutdownWinIo = ( LPFNDLLSHUTDOWNWINIO )GetProcAddress( m_hDLL, "ShutdownWinIo" );
	if ( !m_lpfnDllShutdownWinIo ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"ShutdownWinIo\" )\n", m_hDLL );
		return -1;
	}

	// 3.	
	m_lpfnDllGetPortVal = ( LPFNDLLGETPORTVAL )GetProcAddress( m_hDLL, "GetPortVal" );
	if ( !m_lpfnDllGetPortVal ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"GetPortVal\" )\n", m_hDLL );
		return -1;
	}

	// 4.
	m_lpfnDllSetPortVal = ( LPFNDLLSETPORTVAL )GetProcAddress( m_hDLL, "SetPortVal" );
	if ( !m_lpfnDllSetPortVal ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"SetPortVal\" )\n", m_hDLL );
		return -1;
	}

	// 5.
	m_lpfnDllMapPhysToLin = ( LPFNDLLMAPPHYSTOLIN )GetProcAddress( m_hDLL, "MapPhysToLin" );
	if ( !m_lpfnDllMapPhysToLin ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"MapPhysToLin\" )\n", m_hDLL );
		return -1;
	}

	// 6.
	m_lpfnDllUnmapPhysicalMemory = ( LPFNDLLUNMAPPHYSICALMEMORY )GetProcAddress( m_hDLL, "UnmapPhysicalMemory" );
	if ( !m_lpfnDllUnmapPhysicalMemory ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"UnmapPhysicalMemory\" )\n", m_hDLL );
		return -1;
	}

	// 7.
	m_lpfnDllGetPhysLong = ( LPFNDLLGETPHYSLONG )GetProcAddress( m_hDLL, "GetPhysLong" );
	if ( !m_lpfnDllGetPhysLong ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"GetPhysLong\" )\n", m_hDLL );
		return -1;
	}

	// 8.
	m_lpfnDllSetPhysLong = ( LPFNDLLSETPHYSLONG )GetProcAddress( m_hDLL, "SetPhysLong" );
	if ( !m_lpfnDllSetPhysLong ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
		TRACE( "GetProcAddress( %u, \"SetPhysLong\" )\n", m_hDLL );
		return -1;
	}

	// WinIo.dll v1.3 傛傝丄9X/NT宯娭學側偔慡偰僐乕儖偡傞
	// 	(NT or 2000 偱偁傟偽 InitializeWinIo()傪僐乕儖)
	if ( /* isNT() */ 1 )
		m_lpfnDllInitializeWinIo( );


	// 嵟弶偺億乕僩抣傪妎偊偰偍偔
	ReadPort( m_InitialDataPort, m_wDataPort );

	return 0;
}


//////////////////////////////////////////////////////////////////////
// Description
//		WinIo.DLL 傪奐曻偡傞
// In
//		側偟
// Out
//		側偟
// Return
//		側偟
//////////////////////////////////////////////////////////////////////
void CWio::End()
{

	// WinIo.dll v1.3 傛傝丄9x/NT宯娭學側偔丄慡偰僐乕儖
	// 	(NT or 2000 偱偁傟偽 ShutdownWinIo()傪僐乕儖)
	if ( /* isNT() */ 1  )
		m_lpfnDllShutdownWinIo( );

	// 僨乕僞億乕僩偵嵟弶偺抣傪彂偒偙傫偱偍偔
	WritePort( m_InitialDataPort );

	if ( m_hDLL != 0 ) {
		FreeLibrary( m_hDLL );
		m_hDLL = 0;
	}
}


//////////////////////////////////////////////////////////////////////
// Description
//		OS偑 NT枖偼2000 偱偁傞偐斲偐傪僠僃僢僋偡傞
// In
//		側偟
// Out
//		側偟
// Return
//		TRUE:	NTor2000偱偁傞
//		FALSE:	9X 偱偁傞
//////////////////////////////////////////////////////////////////////
//#if 0
#if 1
BOOL CWio::isNT()
{
	// OSVERSIONINFO 峔憿懱偺昁梫側屄強傪杽傔傞
	OSVERSIONINFO osVer;
	osVer.dwOSVersionInfoSize = sizeof(osVer);
	
	// OS 偺僶乕僕儑儞忣曬偺庢摼
	GetVersionEx(&osVer);
	
	// OS 偑 Win32 NT 僾儔僢僩僼僅乕儉偐傪敾抐
	if (osVer.dwPlatformId == VER_PLATFORM_WIN32_NT)
		return TRUE;
	
	return FALSE;
}
#endif


//////////////////////////////////////////////////////////////////////
// Description
//		LPT僗僥乕僞僗億乕僩偐傜1byte僨乕僞傪撉傒崬傓
// In
//		庴怣僨乕僞偺嶲徠: BYTE &
// Out
//		庴怣僨乕僞(擖椡堷悢偑嶲徠側偺偱寭偹偰偄傞)
// Return
//		true:	惉岟
//		false:	僄儔乕
// Note
//		撉傒崬傫偩1byte僨乕僞偺 MSB = 僾儕儞僞僐僱僋僞偺 pin11(價僕乕怣崋偺斀揮)
//////////////////////////////////////////////////////////////////////
bool CWio::ReadPort( BYTE &byteData )
{
	DWORD dwPortVal = 0;		// 庴怣僶僢僼傽
	bool bRet = m_lpfnDllGetPortVal( m_wStatusPort, &dwPortVal, 1 /* 1byte */ );
	if ( bRet == false )
		return false;
	byteData = *( reinterpret_cast<BYTE *>( &dwPortVal ) );
	return true;
}


//////////////////////////////////////////////////////////////////////
// Description
//		LPT僨乕僞億乕僩偵1byte僨乕僞傪弌椡偡傞
// In
//		彂偒崬傒偨偄僨乕僞: BYTE
// Out
//		側偟
// Return
//		true:	惉岟
//		false:	僄儔乕
// Note
//		1byte僨乕僞偺 bit0乣bit7 偑丄僾儕儞僞僐僱僋僞偺 pin2乣9 偵憡摉
//////////////////////////////////////////////////////////////////////
bool CWio::WritePort( BYTE byteData )
{
	DWORD	dwPortVal = 0;		// 憲怣僨乕僞
	*( reinterpret_cast<BYTE *>( &dwPortVal ) ) = byteData;

	bool bRet = m_lpfnDllSetPortVal( m_wDataPort, dwPortVal, 1 /* byte */ );

	return true;
}


//////////////////////////////////////////////////////////////////////
// Description
//		LPT億乕僩傾僪儗僗傪妉摼偡傞
// Return
//		LPT億乕僩傾僪儗僗: WORD
//////////////////////////////////////////////////////////////////////
WORD CWio::GetLptPort()
{
	return m_wDataPort;		// 僨乕僞億乕僩
}


//////////////////////////////////////////////////////////////////////
// Description
//		LPT億乕僩傾僪儗僗傪愝掕偡傞
//		僨僼僅儖僩偺傾僪儗僗偐傜曄峏偟偨偄応崌偵僐乕儖偡傞
//		億乕僩傪曄峏偟偨傜丄偦偺弶婜抣傪曐帩偟偰偍偔(廔椆帪偵栠偡偨傔)
// In
//		LPT億乕僩傾僪儗僗: WORD
//		bSetOnly         : BOOL		TRUE 偺帪偼丄嵟弶偺億乕僩抣偼撉傑側偄
//									CWio僀僯僔儍儔僀僘慜偵杮娭悢偑屇偽傟傞偲偒傪峫椂
// Out
//		側偟
// Note
//		巜掕偝傟傞偺偼, 378h, 278h, 3BCh 偺偄偢傟偐偵側傞
//		傑偨僗僥乕僞僗億乕僩偺傾僪儗僗偼僨乕僞億乕僩偺傾僪儗僗偵 1壛嶼偟偨
//		傕偺偲寛傑偭偰偄傞(PC/AT).
//////////////////////////////////////////////////////////////////////
void CWio::SetLptPort( WORD wPort, BOOL bSetOnly )
{
	m_wDataPort   = wPort;			// 僨乕僞億乕僩
	m_wStatusPort = wPort + 1;		// 僗僥乕僞僗億乕僩
	if ( bSetOnly ) return;

	// 嵟弶偺億乕僩抣傪妎偊偰偍偔
	ReadPort( m_InitialDataPort, m_wDataPort );

}


//////////////////////////////////////////////////////////////////////
// Description
//		巜掕偟偨億乕僩偐傜1byte僨乕僞傪撉傒崬傓
// In
//		庴怣僨乕僞偺嶲徠: BYTE &
//		巜掕偡傞億乕僩傾僪儗僗(e.g. 0x379): WORD
// Out
//		庴怣僨乕僞(擖椡堷悢偑嶲徠側偺偱寭偹偰偄傞)
// Return
//		true:	惉岟
//		false:	僄儔乕
//////////////////////////////////////////////////////////////////////
bool CWio::ReadPort( BYTE &byteData, WORD dPort )
{
	DWORD dwPortVal = 0;		// 庴怣僶僢僼傽
	bool bRet = m_lpfnDllGetPortVal( dPort, &dwPortVal, 1 /* 1byte */ );
	if ( bRet == false )
		return false;
	byteData = *( reinterpret_cast<BYTE *>( &dwPortVal ) );
	return true;
}


//////////////////////////////////////////////////////////////////////
// Description
//		巜掕偟偨億乕僩偵1byte僨乕僞傪弌椡偡傞
// In
//		彂偒崬傒偨偄僨乕僞: BYTE
//		彂偒崬傒偨偄億乕僩: WORD
// Out
//		側偟
// Return
//		true:	惉岟
//		false:	僄儔乕
//////////////////////////////////////////////////////////////////////
bool CWio::WritePort( BYTE byteData, WORD wPort )
{
	DWORD	dwPortVal = 0;		// 憲怣僨乕僞
	*( reinterpret_cast<BYTE *>( &dwPortVal ) ) = byteData;

	bool bRet = m_lpfnDllSetPortVal( wPort, dwPortVal, 1 /* byte */ );

	return true;
}
//===========================================================================
//===========================================================================
//===========================================================================

int CWio::check_dll()
{
	int flag=1;
	if ( LoadLibrary( "WinIo.dll" ) == 0 ) {
		flag=0;
	}
	return flag;
}



DWORD CWio::check_win_os()
{
	OSVERSIONINFO  osver ;
	osver.dwOSVersionInfoSize = sizeof( osver ) ;
	if( !GetVersionEx( &osver ) )
	{
		return FALSE ;
	}
	return (osver.dwPlatformId);
}

⌨️ 快捷键说明

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