📄 ch365intexam.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 + -