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

📄 easyisp1581.cpp

📁 51单片机众多优秀的开发源程序:ZLG7290例程*ZLG7290汇编例程*蜂鸣器音乐例程*蜂鸣器响例程*读EEPROM并显示例程*16×2LCD模块例程*128×64点阵LCD模块例程*直连KEY和
💻 CPP
字号:
// EasyISP1581.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

#include <windows.h>
#include <winbase.h>

#include "devioctl.h"
#include <setupapi.h>
#include <basetyps.h>
#include <stdio.h>

#include "EasyISP1581.h"
#include "Rwbulk.h"
#include "ioctl.h"

HANDLE m_devhandle=NULL;
HANDLE m_pipehandle=NULL;
int m_pipenum;

/*******************************************************
入口参数:
函数功能:查找并初始化USB
*******************************************************/
int __stdcall ISP1581_Init()
{
	return init();
}
/*******************************************************
入口参数:
函数功能:打开USB设备
*******************************************************/
HANDLE __stdcall ISP1581_OpenDev()
{
	m_devhandle=open_dev();
	return m_devhandle;
}
/*******************************************************
入口参数:
pipename:存储USB管道名称
函数功能:打开所要操作的USB管道,要对USB进行读写操作之前,
必须要先打开所要进行操作的管道。
注:
"PIPE00","PIPE02"为读取数据管道
"PIPE01","PIPE03"为写入数据管道
"PIPE00","PIPE01"属于端点1
"PIPE02","PIPE03"属于端点2
*******************************************************/
HANDLE __stdcall ISP1581_OpenPipe(char *pipename)
{
	return open_file_os(pipename);

}
/*******************************************************
入口参数:
函数功能:关闭USB设备
*******************************************************/
int __stdcall ISP1581_CloseDev(HANDLE devhandle)
{
	CloseHandle(devhandle);

	return 0;
}
/*******************************************************
入口参数:
函数功能:关闭已经打开的管道
*******************************************************/
int __stdcall ISP1581_ClosePipe(HANDLE pipehandle)
{
	CloseHandle(pipehandle);
	return 0;
}
/*******************************************************
入口参数:
函数功能:重启管道
*******************************************************/
void ResetPipe(HANDLE pipehandle)
{
	DWORD nbytes,lasterror=0;
	OVERLAPPED os;
	memset(&os,0,sizeof(OVERLAPPED));
	os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);

	if(!DeviceIoControl(pipehandle,
		IOCTL_1581_RESET_PIPE,
		0,0,0,0,&nbytes,&os))
	{
		if((lasterror=::GetLastError())==ERROR_IO_PENDING)
		{
			switch(::WaitForSingleObject(os.hEvent,1000))
			{
			case WAIT_OBJECT_0:
				if(!::GetOverlappedResult(pipehandle,&os,&nbytes,FALSE))
				{
					lasterror=::GetLastError();
				}
				else
					lasterror=0;
				break;
			case WAIT_TIMEOUT:
				::CancelIo(pipehandle);
				lasterror=ERROR_TIMEOUT;
				break;
			default:
				lasterror=::GetLastError();
				break;
			}
		}
	}
	CloseHandle(os.hEvent);	
}
/*******************************************************
入口参数:
pipehandle: 所要操作并且已经打开的管道句柄
recbuffer:接收数据缓冲区
bufferlen:接收数据缓冲区长度,必须为实际所要接收的数据长度
waittiem:等待超时时间,为-1表示一直等待
函数功能:从USB设备读取数据,在调用此函数之前必须确保USB设
备和所要操作的管道已经打开
*******************************************************/
int __stdcall ISP1581_Read(HANDLE pipehandle,unsigned char *recbuffer,int bufferlen,int waittime)
{
	DWORD nbytes=0,lasterror=0;
	OVERLAPPED os;
	memset(&os,0,sizeof(OVERLAPPED));

	os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
	if(!ReadFile(pipehandle,recbuffer,bufferlen,&nbytes,&os))
	{
		if((lasterror=::GetLastError())==ERROR_IO_PENDING)
		{
			switch(::WaitForSingleObject(os.hEvent,(DWORD)waittime))
			{
			case WAIT_OBJECT_0:
				if(!::GetOverlappedResult(pipehandle,&os,&nbytes,FALSE))
				{
					lasterror=::GetLastError();
				}
				else
					lasterror=0;
				break;
			case WAIT_TIMEOUT:
				::CancelIo(pipehandle);
				lasterror=ERROR_TIMEOUT;
				break;
			default:
				lasterror=::GetLastError();
				break;
			}
		}
	}
	CloseHandle(os.hEvent);
	if(lasterror!=0)
	{
		ResetPipe(pipehandle);
	}
	if(lasterror!=0)
		return -1;
	return nbytes;

}

/*******************************************************
入口参数:
pipehandle: 所要操作并且已经打开的管道句柄
sendbuffer:发送数据缓冲区
bufferlen:发送数据缓冲区长度,必须为实际所要发送的数据长度
waittiem:等待超时时间,为-1表示一直等待
函数功能:向USB设备写入数据,在调用此函数之前必须确保USB设
备和所要操作的管道已经打开
*******************************************************/
int __stdcall ISP1581_Write(HANDLE pipehandle,unsigned char *sendbuffer,int bufferlen,int waittime)
{
	DWORD nbytes=0,lasterror=0;
	int i=0;
	int tmpbufferlen=bufferlen;
	OVERLAPPED os;
	memset(&os,0,sizeof(OVERLAPPED));
	
	os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
	

	if(!WriteFile(pipehandle,&sendbuffer[i],bufferlen,&nbytes,&os))
	{
		if((lasterror=::GetLastError())==ERROR_IO_PENDING)
		{
			switch(::WaitForSingleObject(os.hEvent,(DWORD)waittime))
			{
			case WAIT_OBJECT_0:
				if(!::GetOverlappedResult(pipehandle,&os,&nbytes,FALSE))
				{
					lasterror=::GetLastError();
				}
				else
					lasterror=0;
				break;
			case WAIT_TIMEOUT:
				::CancelIo(pipehandle);
				lasterror=ERROR_TIMEOUT;
				break;
			default:
				lasterror=::GetLastError();
				break;
			}
		}
	}
	if(lasterror!=0)
	{
		ResetPipe(pipehandle);
	}	
	CloseHandle(os.hEvent);
	if(lasterror!=0)
		return -1;
	return nbytes;
}
/*******************************************************
入口参数:
devhandle: 所要操作并且已经打开的设备句柄
code:控制代码,为1表示以扫描仪方式读取数据,为0表示以打印机方式写入数据
length:此长度指的是马上要进行的读写操作的缓冲区的长度
函数功能:发送厂商请求,请求以打印机方式写入数据或以扫描仪方式读取数据
*******************************************************/
int __stdcall ISP1581_Vender_ScanOrPrint(HANDLE devhandle,unsigned char code,int length)
{
	IO_BLOCK ioBlock;
	IO_REQUEST ioRequest;
	DWORD nbytes,lasterror=0;
	OVERLAPPED os;
	memset(&os,0,sizeof(OVERLAPPED));
	os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
	
	ioRequest.uAddressL = 0;
	ioRequest.bAddressH = 0;
	ioRequest.uSize = length;
	ioRequest.bCommand = code;
	
	
	ioBlock.uOffset = 0;
	ioBlock.uLength = sizeof(IO_REQUEST);
	ioBlock.pbyData = (PUCHAR)&ioRequest;
	ioBlock.uIndex = SETUP_DMA_REQUEST;
	
	if(!DeviceIoControl(devhandle,
		IOCTL_WRITE_REGISTERS,
		(PVOID)&ioBlock,sizeof(IO_BLOCK),0,0,&nbytes,&os))
	{
		if((lasterror=::GetLastError())==ERROR_IO_PENDING)
		{
			switch(::WaitForSingleObject(os.hEvent,1000))
			{
			case WAIT_OBJECT_0:
				if(!::GetOverlappedResult(devhandle,&os,&nbytes,FALSE))
				{
					lasterror=::GetLastError();
				}
				else
					lasterror=0;
				break;
			case WAIT_TIMEOUT:
				::CancelIo(devhandle);
				lasterror=ERROR_TIMEOUT;
				break;
			default:
				lasterror=::GetLastError();
				break;
			}
		}
	}
	CloseHandle(os.hEvent);	
	if(lasterror==0)
		return lasterror;
	return -1;
}
/*******************************************************
入口参数:
devhandle: 所要操作并且已经打开的设备句柄
code:控制代码,为1表示从E2PROM读取数据,为0表示向E2PROM写入数据
offset:为所要进行操作的E2PROM起始地址
length:此长度指的是马上要进行的读写操作的缓冲区的长度
函数功能:发送厂商请求,请求对E2PROM进行操作
*******************************************************/
int __stdcall ISP1581_Vender_E2prom(HANDLE devhandle,unsigned char code,unsigned char offset,int length)
{
	IO_BLOCK ioBlock;
	IO_REQUEST ioRequest;
	DWORD nbytes,lasterror=0;
	OVERLAPPED os;
	memset(&os,0,sizeof(OVERLAPPED));
	os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
	
	ioRequest.uAddressL = 0;
	ioRequest.bAddressH = 0;
	ioRequest.uSize = length;
	ioRequest.bCommand = code;
	
	
	ioBlock.uOffset = offset;
	ioBlock.uLength = sizeof(IO_REQUEST);
	ioBlock.pbyData = (PUCHAR)&ioRequest;
	ioBlock.uIndex = SETUP_E2PROM_REQUEST;
	
	if(!DeviceIoControl(devhandle,
		IOCTL_WRITE_REGISTERS,
		(PVOID)&ioBlock,sizeof(IO_BLOCK),0,0,&nbytes,&os))
	{
		if((lasterror=::GetLastError())==ERROR_IO_PENDING)
		{
			switch(::WaitForSingleObject(os.hEvent,1000))
			{
			case WAIT_OBJECT_0:
				if(!::GetOverlappedResult(devhandle,&os,&nbytes,FALSE))
				{
					lasterror=::GetLastError();
				}
				else
					lasterror=0;
				break;
			case WAIT_TIMEOUT:
				::CancelIo(devhandle);
				lasterror=ERROR_TIMEOUT;
				break;
			default:
				lasterror=::GetLastError();
				break;
			}
		}
	}
	CloseHandle(os.hEvent);	
	if(lasterror==0)
		return lasterror;
	return -1;
}
/*******************************************************
入口参数:
devhandle: 所要操作并且已经打开的设备句柄
version: 版本号
函数功能:厂商请求读取,此函数的功能为读取版本号
*******************************************************/
int __stdcall ISP1581_Vender_Read(HANDLE devhandle,unsigned char &version)
{
	DWORD nbytes,lasterror=0;
	OVERLAPPED os;
	memset(&os,0,sizeof(OVERLAPPED));
	os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
	IO_BLOCK ioBlock;

	ioBlock.uOffset = 0;
	ioBlock.uLength = 1;
	ioBlock.pbyData = (PUCHAR)&version;
	ioBlock.uIndex = GET_FIRMWARE_VERSION;
				
	if(!DeviceIoControl(devhandle,
		IOCTL_READ_REGISTERS,
		(PVOID)&ioBlock,sizeof(IO_BLOCK),(PVOID)&version,1,&nbytes,&os))
	{
		if((lasterror=::GetLastError())==ERROR_IO_PENDING)
		{
			switch(::WaitForSingleObject(os.hEvent,1000))
			{
			case WAIT_OBJECT_0:
				if(!::GetOverlappedResult(devhandle,&os,&nbytes,FALSE))
				{
					lasterror=::GetLastError();
				}
				else
					lasterror=0;
				break;
			case WAIT_TIMEOUT:
				::CancelIo(devhandle);
				lasterror=ERROR_TIMEOUT;
				break;
			default:
				lasterror=::GetLastError();
				break;
			}
		}
	}
	CloseHandle(os.hEvent);	
	if(lasterror==0)
		return lasterror;
	return -1;

}

⌨️ 快捷键说明

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