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

📄 ch365intexam.cpp

📁 南京沁恒电子有限公司USB通用设备接口芯片资料
💻 CPP
字号:
// CH365IntExam.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "resource.h"
#include	<windows.h>
#include	<stdlib.h>
#include	<stdio.h>
#include	<conio.h>
#include	<setupapi.h>
#include	<winioctl.h>
#include	"CH365DLL.H"
#pragma comment(lib,"CH365DLL")

#define WM_1INTNOTIFY WM_USER+1  //设备0中断通知消息
#define WM_2INTNOTIFY WM_USER+2  //设备1中断通知消息

HINSTANCE   mSaveInstance;		// 实例
HWND        mSaveDialogMain;	// 主对话框

mPCH365_MEM_REG   CH365MEMREG;
CHAR     mCaptionInform[] = " 信息提示 ";
CHAR     mCaptionInform1[] = " 中断情况 ";

ULONG   mIndex = 0,mCount=0;
mPCH365_MEM_REG  mMemBaseAddr = NULL; //MEM Base Address
mPCH365_IO_REG   mIOBaseAddr = NULL;   //IO Base Address
mPCH365_CFG_REG  dllCFGCtl = NULL;
ULONG  mIndex2 = 1,mCount2=0;
mPCH365_MEM_REG  mMemBaseAddr2 = NULL; //MEM Base Address
mPCH365_IO_REG   mIOBaseAddr2 = NULL;   //IO Base Address
mWIN32_COMMAND	iCommand={0},iCommand2={0}; 

LRESULT CALLBACK mDialogMain( HWND, UINT, WPARAM, LPARAM );
int  mGetDevIndex(HWND hDialog);
void mGetIOBaseAddr(HWND   hDialog);
void mGetMemBaseAddr(HWND  hDialog);
void mGetIntLineNUM(HWND  hDialog);
void mGetIOBaseAddr2(HWND   hDialog);
void mGetMemBaseAddr2(HWND  hDialog);
void mGetIntLineNUM2(HWND  hDialog);
void mGetIntCount(HWND  hDialog);
void mInitCheckBox(HWND hDialog);
void mShowDllVer(HWND hDialog);
void mShowDevVer(HWND hDialog);
int  GetDevIndex(HWND hDialog);

VOID  ShowInfomation (LPCTSTR lpFormat,...){//显示格式化字符串
    va_list arglist;
	char TextBufferTmp[500]="";    
	ULONG index=0;
    va_start(arglist, lpFormat);	
	wvsprintf(TextBufferTmp,lpFormat,arglist);
	SendDlgItemMessage(mSaveDialogMain,IDC_InformationShow,LB_ADDSTRING,0,(LPARAM)(LPCTSTR)TextBufferTmp);
	index=SendDlgItemMessage(mSaveDialogMain,IDC_InformationShow,LB_GETCOUNT,0,0);
	SendDlgItemMessage(mSaveDialogMain,IDC_InformationShow,LB_SETCURSEL,index,0);
	return;
}
void  CALLBACK InterruptEvent(void) //设备0中断通知消息
{		
	mCount++; //中断次数记数
	PostMessage(mSaveDialogMain,WM_1INTNOTIFY,0,0);	//发送设备0中断消息
}

void  CALLBACK InterruptEvent2(void) //设备1中断通知消息
{	
	mCount2++;//中断次数记数	
	PostMessage(mSaveDialogMain,WM_2INTNOTIFY,0,0);	//发送设备1断消息
}

int	APIENTRY	WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd )
{
	mSaveInstance = hInstance;
	return( DialogBox( hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)mDialogMain ) );    //调用主对话框
}

//主对话框事件
LRESULT CALLBACK mDialogMain( HWND hDialog, UINT uMessage, WPARAM wParam, LPARAM lParam )
{	
	char tem[100]="";	
	switch ( uMessage )	{		
	case WM_1INTNOTIFY:{
		UCHAR TemCmdBuf[mMAX_COMMAND_LENGTH+mWIN32_COMMAND_HEAD]="";//定义最大的中断命令缓冲区			
		CH365mReadIntCommand(mIndex,(mPWIN32_COMMAND)TemCmdBuf,1);//读设备1中断缓冲区1
		//显示信息
		ShowInfomation("****%d#设备中断缓冲区1->",mIndex);
		ShowInfomation("mFunction=%X",((mPWIN32_COMMAND)TemCmdBuf)->mFunction);//输出读设备0的端口信息		
		ShowInfomation("mAddress:%X(硬件循环计数寄存器)",((mPWIN32_COMMAND)TemCmdBuf)->mAddress);//输出读设备0的端口信息
        ShowInfomation("mBuffer[0]=%X",((mPWIN32_COMMAND)TemCmdBuf)->mBuffer[0]);		
		ShowInfomation("****");			
        //显示中断次数
		sprintf(tem,"..%d",mCount); 
		SetWindowText(GetDlgItem(hDialog,IDC_EDTCOUNT),tem);
					   }
		break;
	case WM_2INTNOTIFY:{//设备2中断消息
		UCHAR	 TemCmdBuf[mMAX_COMMAND_LENGTH+mWIN32_COMMAND_HEAD]="";//定义最大的中断命令缓冲区			
		CH365mReadIntCommand(mIndex2,(mPWIN32_COMMAND)TemCmdBuf,2);//读中断缓冲区2			
		//显示信息
		ShowInfomation("****%d#设备中断缓冲区2->",mIndex2);
		ShowInfomation("mFunction: %X",((mPWIN32_COMMAND)TemCmdBuf)->mFunction);//输出读设备0的端口信息		
		ShowInfomation("mAddress: %X(硬件循环计数寄存器)",((mPWIN32_COMMAND)TemCmdBuf)->mAddress);//输出读设备0的端口信息
        ShowInfomation("mBuffer[0]: %X",((mPWIN32_COMMAND)TemCmdBuf)->mBuffer[0]);		
		ShowInfomation("****");			
        //显示中断次数
		sprintf(tem,"..%d",mCount2); 
		SetWindowText(GetDlgItem(hDialog,IDC_EDTCOUNT2),tem);
					   }
		break;
	case WM_INITDIALOG:{        //初始化		
		char i,indexstr[5]="";
		mSaveDialogMain = hDialog;
		mIndex = 0;		
		//检查系统中有没有ch365dll.dll动态库.
		if ( LoadLibrary( "CH365DLL.DLL" ) == NULL ){  // 加载DLL失败,可能未安装到系统中		
			MessageBox( hDialog, "无法加载CH365的DLL", mCaptionInform, MB_ICONSTOP | MB_OK );			
			return( TRUE );
		}
		for(i=0;i<10;i++){ //初始设备号
			ltoa(i,indexstr,10);
			SendDlgItemMessage(hDialog,IDC_DevIndex,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)indexstr);
			SendDlgItemMessage(hDialog,IDC_DevIndex2,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)indexstr);
		}
		SendDlgItemMessage(hDialog,IDC_DevIndex,CB_SETCURSEL,0,0);
		SendDlgItemMessage(hDialog,IDC_DevIndex2,CB_SETCURSEL,1,0);		
		mShowDllVer(hDialog);		//显示DLL版本号			1
		mShowDevVer(hDialog);		//显示驱动版本号	
					   }
		break;		
	case WM_COMMAND:{			
		switch(LOWORD(wParam)){						
		case IDC_CLOSE:         			//关闭设备							 
			CH365mSetIntRoutine(mIndex,NULL);//关闭中断服务程序
			CH365mCloseDevice(mIndex);       //关闭设备							 

			mCount= 0 ;//中断次数复位				
			
			SetDlgItemText(hDialog,IDC_EDTBASEADDR,"");
			SetDlgItemText(hDialog,IDC_EDTINTLINE,"");
			SetDlgItemText(hDialog,IDC_EDITMEM,"");			
			break;
		case IDC_CLOSE2:         				//关闭设备				
			CH365mSetIntRoutine(mIndex2,NULL);  //关闭中断服务程序
			CH365mCloseDevice(mIndex2);         //关闭设备			

			mCount2=0; //中断次数复位			

			SetDlgItemText(hDialog,IDC_EDTBASEADDR2,"");
			SetDlgItemText(hDialog,IDC_EDTINTLINE2,"");
			SetDlgItemText(hDialog,IDC_EDITMEM2,"");
			break;
		case IDC_OPEN:{						//打开设备			
			mIndex = SendDlgItemMessage(hDialog,IDC_DevIndex,CB_GETCURSEL,0,0);//获取设备序号 			
			if ( CH365mOpenDevice(mIndex, TRUE, TRUE ) == INVALID_HANDLE_VALUE ) {
				sprintf(tem,"无法打开%d#CH365设备",mIndex);
				MessageBox( hDialog, tem, mCaptionInform, MB_ICONSTOP | MB_OK );
				break;
			}
 			sprintf(tem,"%d#设备\0",mIndex);
			SetDlgItemText(hDialog,IDC_Dev0Frame,tem);
           
			mGetIOBaseAddr(hDialog);    //获取I/O基址
			mGetMemBaseAddr(hDialog);   //获取MEM基址 
			mGetIntLineNUM(hDialog);    //获取中断号
			
			ZeroMemory(&iCommand,sizeof(iCommand));
			iCommand.mFunction = mFuncReadIoByte;		//发送I/O口写字命令,命令代码,该命令在硬件中断时由驱动程序执行
			iCommand.mAddress = &mIOBaseAddr->mCh365IoTime;	//读硬件循环计数寄存器
			iCommand.mLength =1;       //要读的数据字节数		
			CH365mWriteIntCommand(mIndex,&iCommand,1);  //向命令缓冲区1内写中断执行命令
			ZeroMemory(&iCommand,sizeof(iCommand));

			CH365mSetIntRoutine(mIndex,InterruptEvent);//设置中断服务程序
					  }
			break;
		case IDC_OPEN2:{	//打开设备
			
			mIndex2 = SendDlgItemMessage(hDialog,IDC_DevIndex2,CB_GETCURSEL,0,0); 
			sprintf(tem,"%d#设备",mIndex2);
			SetDlgItemText(hDialog,IDC_STATIC2,tem);
			if ( CH365mOpenDevice(mIndex2, TRUE, TRUE ) == INVALID_HANDLE_VALUE ) {
				sprintf(tem,"无法打开%d#CH365设备",mIndex2);
				MessageBox( hDialog, tem, mCaptionInform, MB_ICONSTOP | MB_OK );
				break;
			}		
			mGetIOBaseAddr2(hDialog);    //得到I/O基址
			mGetMemBaseAddr2(hDialog);   //得到MEM基址 
			mGetIntLineNUM2(hDialog);    //得到中断号
			
			ZeroMemory(&iCommand,sizeof(iCommand2));
			iCommand2.mFunction = mFuncReadIoByte;		//发送I/O口写字命令,命令代码,该命令在硬件中断时由驱动程序执行
			iCommand2.mAddress = &mIOBaseAddr2->mCh365IoTime;	//读硬件循环计数寄存器			
			iCommand2.mLength = 1;				          //数据长度设定,操作数据长度,以字节计算
			CH365mWriteIntCommand(mIndex2,&iCommand2,2);  //向命令缓冲区2内写数据
			CH365mSetIntRoutine(mIndex2,InterruptEvent2);			
					   }
			break;
		case IDC_COUNT:
			{
				CHAR sByte[12]="";
				sprintf( sByte,"..%d\x0", mCount );
				SetDlgItemText(hDialog,IDC_EDTCOUNT,sByte);
			}
			break;
		case IDC_COUNT2:
			{			
				CHAR sByte[12]="";
				sprintf( sByte,"..%d\x0", mCount2 );
				SetDlgItemText(hDialog,IDC_EDTCOUNT2,sByte);
			}
			break;
		case IDC_ClearShow:
			SendDlgItemMessage(mSaveDialogMain,IDC_InformationShow,LB_RESETCONTENT,0,0);				
			break;
		case WM_DESTROY:
			CH365mSetIntRoutine(mIndex,NULL);
			CH365mCloseDevice(mIndex);  
			
			CH365mSetIntRoutine(mIndex2,NULL);
			CH365mCloseDevice(mIndex2);  
			
			DestroyWindow(hDialog);
			break;
		default:
			return DefWindowProc(hDialog, uMessage, wParam, lParam);
		}		
		break;
					}	
	case WM_DESTROY:
		CH365mSetIntRoutine(mIndex,NULL);
		CH365mCloseDevice(mIndex);  
		
		CH365mSetIntRoutine(mIndex2,NULL);
		CH365mCloseDevice(mIndex2);  
		
		PostQuitMessage(0);
		break;		
	} 	
	return(0);	
}


void mGetIOBaseAddr(HWND  hDialog)
{
	if (CH365mGetIoBaseAddr(mIndex, &mIOBaseAddr))
	{
		CHAR sByte[12];
		sprintf( sByte,"%04X\x0", mIOBaseAddr );
		SetDlgItemText(hDialog,IDC_EDTBASEADDR,sByte);
	}
	else
	{
		MessageBox(hDialog,"获得I/O基址失败!","提示",MB_OK|MB_ICONSTOP);
		SetDlgItemText(hDialog,IDC_EDTBASEADDR,"");
	}
	
}	

void mGetMemBaseAddr(HWND hDialog)
{
	if (CH365mGetMemBaseAddr(mIndex, &mMemBaseAddr ))
	{
		CHAR sByte[12];
		sprintf( sByte,"%04X\x0", mMemBaseAddr );
		SetDlgItemText(hDialog,IDC_EDITMEM,sByte);
	}
	else
	{
		MessageBox(hDialog,"获得寄存器基址失败!","提示",MB_OK|MB_ICONSTOP);
		SetDlgItemText(hDialog,IDC_EDITMEM,"");
	}
}

void mGetIntLineNUM(HWND hDialog)
{
	ULONG oIntLine;
	if (CH365mGetIntLine(mIndex, &oIntLine)) 
	{
		CHAR sByte[12];
		sprintf( sByte,"%02X\x0", oIntLine );
		SetDlgItemText(hDialog,IDC_EDTINTLINE,sByte);
	}
	else
	{
		MessageBox(hDialog,"获得中断号失败!","提示",MB_OK|MB_ICONSTOP); 
		SetDlgItemText(hDialog,IDC_EDTINTLINE,"");
	}
}

void mGetIOBaseAddr2(HWND  hDialog)
{
	if (CH365mGetIoBaseAddr(mIndex2, &mIOBaseAddr2))
	{
		CHAR sByte[12];
		sprintf( sByte,"%04X\x0", mIOBaseAddr2 );
		SetDlgItemText(hDialog,IDC_EDTBASEADDR2,sByte);
	}
	else
	{
		MessageBox(hDialog,"获得I/O基址失败!","提示",MB_OK|MB_ICONSTOP);
		SetDlgItemText(hDialog,IDC_EDTBASEADDR,"");
	}
	
}	

void mGetMemBaseAddr2(HWND hDialog)
{
	if (CH365mGetMemBaseAddr(mIndex2, &mMemBaseAddr2 ))
	{
		CHAR sByte[12];
		sprintf( sByte,"%04X\x0", mMemBaseAddr2 );
		SetDlgItemText(hDialog,IDC_EDITMEM2,sByte);
	}
	else
	{
		MessageBox(hDialog,"获得寄存器基址失败!","提示",MB_OK|MB_ICONSTOP);
		SetDlgItemText(hDialog,IDC_EDITMEM2,"");
	}
}

void mGetIntLineNUM2(HWND hDialog)
{
	ULONG oIntLine2;
	if (CH365mGetIntLine(mIndex2, &oIntLine2)) 
	{
		CHAR sByte[12];
		sprintf( sByte,"%02X\x0", oIntLine2 );
		SetDlgItemText(hDialog,IDC_EDTINTLINE2,sByte);
	}
	else
	{
		MessageBox(hDialog,"获得中断号失败!","提示",MB_OK|MB_ICONSTOP); 
		SetDlgItemText(hDialog,IDC_EDTINTLINE,"");
	}
}


//获得DLL版本号
void mShowDllVer(HWND hDialog)
{
	ULONG ver = 0;
	char vers[8];
	ver = CH365GetVersion();  
	_ltoa(ver,vers,16);
	if(!SetDlgItemText(hDialog,IDC_EDTDLLVER,vers))
		MessageBox(hDialog,"未能成功获得DLL版本号!","提示",MB_ICONSTOP | MB_OK);
}

//获得驱动版本号
void mShowDevVer(HWND hDialog)
{
	ULONG ver = 0;
	char vers[8];
	ver = CH365GetDrvVersion();  
	_ltoa(ver,vers,16);
	if(!SetDlgItemText(hDialog,IDC_EDTDEVVER,vers))
		MessageBox(hDialog,"未能成功获得驱动版本号!","提示",MB_ICONSTOP | MB_OK);
}

⌨️ 快捷键说明

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