亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usblib.cpp

?? D12+51 的USB1.1PC就用程序
?? CPP
字號:
#include "stdafx.h"
#include "USBlib.h"

#include <mmsystem.h>
#include <devioctl.h>
#include "rwbulk.h"
#include "ioctl.h"

#define WAIT_TIME 10000

CThreadParam m_hread1;
CThreadParam m_hread2;
CThreadParam m_hwrite1;
CThreadParam m_hwrite2;

BOOL ENDp_Out(void * endpoint);
BOOL ENDp_In(void * endpoint);


UINT ThreadWritep1(void *param);
UINT ThreadWritep2(void *param);
UINT ThreadReadp1(void *param);
UINT ThreadReadp2(void *param);

BYTE USB_Readp1Buf[PIPE1_BUF];
BYTE USB_Readp2Buf[PIPE2_BUF];
BYTE USB_Writep1Buf[PIPE1_BUF];
BYTE USB_Writep2Buf[PIPE2_BUF];

UsbDATA g_Endp1read;
UsbDATA g_Endp1write;
UsbDATA g_Endp2read;
UsbDATA g_Endp2write;

BOOL g_bUSBon = FALSE;

BOOL ENDp_Out(void * endpoint)
{  
//    char cc[80];
	struct UsbDATA * Usb_device;
	HANDLE hFile;
	
	Usb_device=(UsbDATA *)endpoint;
	Usb_device->bFlag = TRUE;
	Usb_device->Count = 0;
	
	hFile = open_file(Usb_device->Pipe_name);  //獲得USB句柄 

	if(hFile == INVALID_HANDLE_VALUE)  //無設備時
	{
		AfxMessageBox("驅動程序打開失敗! 不能寫數據");
		return 0;
	} 
	
    else //有設備時
	{
		
		Usb_device->bFlag = TRUE;

		ULONG dwTimeout = 20000;  //大數據包時,要加長時間

		OVERLAPPED ovInternal;
		memset( &ovInternal,0,sizeof(OVERLAPPED) );
		ovInternal.hEvent = CreateEvent( NULL,
			                             TRUE,
										 FALSE,
										 NULL );
		if(ovInternal.hEvent == NULL) 
		{
			AfxMessageBox("不能創建事件!");
		}
		DWORD T_start = GetTickCount();
		//寫設備端點1 OUT的緩沖區
		WriteFile( hFile, 
			       Usb_device->Buf,
				   Usb_device->Length,
				   &Usb_device->Count,
				   &ovInternal);//NULL);//
/*
		long lLastError = ::GetLastError();
		if(lLastError != ERROR_IO_PENDING)  //判斷IO操作是否結束
		{
			return 0;
		}		
*/		
		BOOL bResult = 0;
		DWORD wait = WaitForSingleObject(ovInternal.hEvent, dwTimeout);
		DWORD T_end = GetTickCount();
		DWORD Time =  T_end - T_start;
		switch(wait)
			{
				case WAIT_TIMEOUT:
					{
						CancelIo(hFile); //取消操作
			//			AfxMessageBox("寫數據超時!");
						break;
					}
                case WAIT_OBJECT_0:
					GetOverlappedResult(hFile,&ovInternal,&Usb_device->Count,TRUE);
					bResult = 1;
                    break;
				default :	break;
			}		
	     CloseHandle(hFile);	
		 Usb_device->bFlag = FALSE;	
		 if(Time != 0)
		 {
			 DWORD spead = Usb_device->Count*8/Time;
			 TRACE("len = %X , time = %d, spead = %dKbit\n",Usb_device->Count,Time,spead);
		 }
		 return bResult;  
	}

}
//端點 PC read Device
/*
 * 打開一個端點,進行讀操作,
 * 失敗返回0,成功返回1
 */
BOOL ENDp_In(void * endpoint)
{  
//    char cc[80];
	struct UsbDATA * Usb_device;
	HANDLE hFile;
	
	Usb_device=(UsbDATA *)endpoint;
	Usb_device->bFlag = TRUE;
	Usb_device->Count = 0;
	
	hFile = open_file(Usb_device->Pipe_name);  //獲得USB句柄 

	if(hFile == INVALID_HANDLE_VALUE)  //無設備時
	{
		AfxMessageBox("驅動程序打開失敗! 不能讀數據");
		return 0;
	} 
	
    else //有設備時
	{		
		Usb_device->bFlag = TRUE;
        ULONG Count = 0;
		ULONG dwTimeout = 20000;

		OVERLAPPED ovInternal;
		memset( &ovInternal,0,sizeof(OVERLAPPED) );
		ovInternal.hEvent = CreateEvent( NULL,
			                             TRUE,
										 FALSE,
										 NULL );
		if(ovInternal.hEvent == NULL) 
		{
			AfxMessageBox("不能創建事件!");
		}
		DWORD T_start = GetTickCount();
		//讀設備端點 OUT的緩沖區
		ReadFile( hFile,
			      Usb_device->Buf,
				  Usb_device->Length,
				  &Usb_device->Count,
			      &ovInternal );     //NULL);//
/*
		long lLastError = ::GetLastError();
		if(lLastError != ERROR_IO_PENDING) 
		{
			//出錯處理
		}		
*/
        BOOL  bResult = 0;
		DWORD wait = WaitForSingleObject(ovInternal.hEvent, dwTimeout);
		DWORD T_end = GetTickCount();
		DWORD Time =  T_end - T_start;
		switch(wait)
			{
				case WAIT_TIMEOUT:
					{
						::CancelIo(hFile);
				//		AfxMessageBox("讀數據超時!");						
						break;
					}
                case WAIT_OBJECT_0:
					{
						GetOverlappedResult(hFile,&ovInternal,&Usb_device->Count,TRUE);
						bResult = 1;
						break;
					}
				default : break;
			}
	
    	CloseHandle(hFile);	
		Usb_device->bFlag = FALSE;	
		 if(Time != 0)
		 {
			 DWORD spead = Usb_device->Count*8/Time;
			 TRACE("len = %X , time = %d, spead = %dKbit\n",Usb_device->Count,Time,spead);
		 }
		return bResult;   
	}
}
//端點 復位
BOOL ENDp_Reset(void * endpoint)
{  
//    char cc[80];
	struct UsbDATA * Usb_device;
	HANDLE hFile;
	
	Usb_device=(UsbDATA *)endpoint;
	Usb_device->bFlag = FALSE;
	Usb_device->Count = 0;
	
	hFile = open_file(Usb_device->Pipe_name);  //獲得USB句柄 

	if(hFile == INVALID_HANDLE_VALUE)  //無設備時
	{
		AfxMessageBox("驅動程序打開失敗! 不能寫數據");
		return 0;
	} 
	
    if (hFile != INVALID_HANDLE_VALUE) //有設備時
	{
		
		Usb_device->bFlag = TRUE;

        ULONG Count = 0;
		ULONG dwTimeout = 2000;

		DeviceIoControl(hFile,
			IOCTL_D12_RESET_PIPE,
			0,
			0,
			0,
			0,
			&Count,
			NULL);		
    }// if valid hDevice	
		
	CloseHandle(hFile);	
	Usb_device->bFlag = FALSE;	
    return 1; 
}

/*
 * 接收數據線程
 * 輸入參數:
 * g_Endp1read.Length =  16的整數倍
 * g_Endp1read.Cout = 0
 * 取完數據后thread->bStart = FALSE;
 */
UINT ThreadReadp1(void *param)
{
    CThreadParam *thread;

	//初始化
	thread=(struct CThreadParam *)param;    
	thread->bEnd = FALSE; //線程結束標志
	thread->bInThread = TRUE;
	thread->bStart = FALSE;
//	thread->usb = &g_Endp1read;
	thread->hEvent = CreateEvent(
						  NULL, // pointer to security attributes
						  TRUE,  // flag for manual-reset event
						  FALSE, // flag for initial state
						  NULL // pointer to event-object name
						);
	ResetEvent(thread->hEvent);

	while(!thread->bEnd)
	{
		while(!thread->bStart)  //等待操作
		{
			Sleep(100);
		}          
		if(thread->bEnd) { return 0; } //結束線程
	//	memset(g_Endp1read.Buf,0,128);       
		ResetEvent(thread->hEvent);
		if( ENDp_In(&g_Endp1read) )
		{ 
			thread->bStart = FALSE; 
			SetEvent(thread->hEvent);
		} //有數據接收到  
	}
	thread->bInThread = FALSE;
	return 0;
}

UINT ThreadReadp2(void *param)
{
    CThreadParam *thread;

	thread=(struct CThreadParam *)param;
	thread->bEnd = FALSE; //線程結束標志
	thread->bInThread = TRUE;
	thread->bStart = FALSE;
//	thread->usb = &g_Endp2read;
	thread->hEvent = CreateEvent(
						  NULL, // pointer to security attributes
						  TRUE,  // flag for manual-reset event
						  FALSE, // flag for initial state
						  NULL // pointer to event-object name
						);
	ResetEvent(thread->hEvent);

	while(!thread->bEnd)
	{
		while(!thread->bStart)         //等待操作 
		{
			Sleep(1);
		}          
		if(thread->bEnd) { return 0; } //結束線程

	//	memset(g_Endp2read.Buf,0,128);      
		ResetEvent(thread->hEvent);    //讀數據 
		if( ENDp_In(&g_Endp2read) )
		{ 
			thread->bStart = FALSE; 
			SetEvent(thread->hEvent);
		} //有數據接收到
	}
	thread->bInThread = FALSE;
	return 0;
}
/*
 * 接收數據線程
 * 輸入參數: 
 * g_Endp1write.Length =  16的整數倍
 * g_Endp1write.Cout = 0
 * 開始寫命令thread->bStart = TRUE;
 */

UINT ThreadWritep1(void *param)
{
    CThreadParam *thread;
	thread=(struct CThreadParam *)param;

	thread->bEnd = FALSE; //線程結束標志
	thread->bInThread = TRUE;
//	thread->usb = &g_Endp1write;
	thread->hEvent = CreateEvent(
						  NULL, // pointer to security attributes
						  TRUE,  // flag for manual-reset event
						  FALSE, // flag for initial state
						  NULL // pointer to event-object name
						);
    ResetEvent(thread->hEvent);

	while(!thread->bEnd)
	{		
		if(thread->bStart) //檢測操作命令
		{
			if( ENDp_Out(&g_Endp1write) ) 
			{   
				thread->bStart = FALSE;
				SetEvent(thread->hEvent);
			} //寫完數據,觸發事件
			else
			{  				
				ResetEvent(thread->hEvent);
			}		
			thread->bStart = FALSE;			
		}  
		Sleep(100);
	}
	thread->bInThread = FALSE;
	return 0;
}


UINT ThreadWritep2(void *param)
{
    CThreadParam *thread;

	thread=(struct CThreadParam *)param;

	thread->bEnd = FALSE; //線程結束標志
	thread->bInThread = TRUE;
//	thread->usb = &g_Endp2write;
	thread->hEvent = CreateEvent(
						  NULL, // pointer to security attributes
						  TRUE,  // flag for manual-reset event
						  FALSE, // flag for initial state
						  NULL // pointer to event-object name
						);
    ResetEvent(thread->hEvent);

	while(!thread->bEnd)
	{		
		if(thread->bStart) //檢測操作命令
		{
			if( ENDp_Out(&g_Endp2write) ) 
			{   
				thread->bStart = FALSE;
				SetEvent(thread->hEvent);
			} //寫完數據,觸發事件
			else
			{  				
				ResetEvent(thread->hEvent);
			}		
			thread->bStart = FALSE;			
		}  
		Sleep(100);
	}
	thread->bInThread = FALSE;
	return 0;
}

/*
 * 先設置:
 * g_Endp1write.Length,
 * g_Endp1write.Buf的數據
 */
BOOL USBwriteENDp1(UINT len)
{
	while(g_Endp1write.bFlag) {}	

	g_Endp1write.Length = len;
	g_Endp1write.Count = 0;
	m_hwrite1.bStart = TRUE;
	DWORD dwRet = WaitForSingleObject(m_hwrite1.hEvent, WAIT_TIME);
	ResetEvent(m_hwrite1.hEvent);
	if(dwRet != WAIT_OBJECT_0)
	{
		AfxMessageBox("端點1寫入數據失敗!");
		return 0;
	}
	return 1;
}

BOOL USBwriteENDp2(UINT len)
{
	while(g_Endp2write.bFlag) {}
	
	g_Endp2write.Length = len;
	g_Endp2write.Count = 0;
	m_hwrite2.bStart = TRUE;
	DWORD dwRet = WaitForSingleObject(m_hwrite2.hEvent, WAIT_TIME);
	ResetEvent(m_hwrite2.hEvent);
	if(dwRet != WAIT_OBJECT_0)
	{
		AfxMessageBox("端點2寫入數據失敗!");
		return 0;
	}
    return 1;
}

UINT USBreadENDp1(UINT len)
{
	while(g_Endp1read.bFlag) {}
	
	if(len%16 != 0) { len = (len/16 +1)*16; }
	g_Endp1read.Length = len;
	g_Endp1read.Count = 0;
	m_hread1.bStart = TRUE;
	DWORD dwRet = WaitForSingleObject(m_hread1.hEvent, WAIT_TIME);
	ResetEvent(m_hread1.hEvent);
	if(dwRet != WAIT_OBJECT_0)
	{
		AfxMessageBox("端點1讀取數據失敗!");
		return 0;
	} 
    return g_Endp1read.Count;
} 

UINT USBreadENDp2(UINT len)
{
	while(g_Endp2read.bFlag) {}
	
	if(len%16 != 0) { len = (len/16 +1)*16; }
	g_Endp2read.Length = len;
	g_Endp2read.Count = 0;
	m_hread2.bStart = TRUE;
	DWORD dwRet = WaitForSingleObject(m_hread2.hEvent, WAIT_TIME);
	ResetEvent(m_hread2.hEvent);
	if(dwRet != WAIT_OBJECT_0)
	{
		AfxMessageBox("端點2讀取數據失敗!");
		return 0;
	} 
    return g_Endp2read.Count;
}

//啟動線程,準備讀寫USB端口
void USB_start()
{
	memset(USB_Readp1Buf, 0,PIPE1_BUF);  //管道初始化
	memset(USB_Readp2Buf, 0,PIPE2_BUF); 

    g_Endp1read.Buf = USB_Readp1Buf;//管道初始化
	g_Endp2read.Buf = USB_Readp2Buf;
    g_Endp1write.Buf = USB_Writep1Buf;
	g_Endp2write.Buf = USB_Writep2Buf;
    strcpy(g_Endp1read.Pipe_name, (LPCSTR)"PIPE00"); 
	strcpy(g_Endp1write.Pipe_name, (LPCSTR)"PIPE01"); 
	strcpy(g_Endp2read.Pipe_name, (LPCSTR)"PIPE02"); 
	strcpy(g_Endp2write.Pipe_name, (LPCSTR)"PIPE03"); 

//    g_Endp1read.Length = 128;
	CWinThread * wt = AfxBeginThread( ThreadReadp1, // thread function 
		                              &m_hread1); // argument to thread function 	
	m_hread1.hThread = wt->m_hThread;

 //   g_Endp2read.Length = 128;
	wt = AfxBeginThread( ThreadReadp2, // thread function 
		                 &m_hread2); // argument to thread function 	
	m_hread2.hThread = wt->m_hThread;

	wt = AfxBeginThread( ThreadWritep1, // thread function 
		                 &m_hwrite1  ); // argument to thread function 	
	m_hwrite1.hThread = wt->m_hThread; 

	wt = AfxBeginThread( ThreadWritep2, // thread function 
		                 &m_hwrite2  ); // argument to thread function 	
	m_hwrite2.hThread = wt->m_hThread; 

    g_bUSBon = TRUE;

	TRACE("USB Device Start!\n");
}

void USB_end()
{
	m_hwrite1.bEnd = TRUE;
	m_hwrite2.bEnd = TRUE;
	m_hread1.bEnd  = TRUE;
	m_hread2.bEnd  = TRUE;
	m_hread1.bStart = TRUE;
	m_hread2.bStart = TRUE;	//結束四大線程
    g_bUSBon = FALSE;

	TRACE("USB Device End!\n");
}

BOOL USBcommand()
{
	if( !USBwriteENDp1(8) ) 	{ return 0; }
	if( USBreadENDp1(1) != 1 ) { return 0; }
	return 1;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女人aaa级久久久级| 五月婷婷综合网| 日本女优在线视频一区二区| 国产电影一区在线| 欧美天堂一区二区三区| 欧美精品一区二区三区蜜桃| 亚洲最大色网站| 成人性生交大片免费看在线播放| 91麻豆精品国产91久久久 | 大陆成人av片| 欧美一区二区三区男人的天堂| 中文成人av在线| 国产精品综合网| 日韩一二三四区| 亚洲成a人v欧美综合天堂下载| 大陆成人av片| 国产亚洲精久久久久久| 久久99精品国产.久久久久| 欧美日韩中文国产| 亚洲黄色av一区| 91一区二区三区在线观看| 国产欧美综合色| 国产+成+人+亚洲欧洲自线| 欧美久久久久中文字幕| 亚洲一区二区三区精品在线| 波多野结衣91| 国产精品国产三级国产普通话蜜臀 | 日韩欧美久久久| 亚洲成人综合在线| 欧美天堂一区二区三区| 亚洲蜜桃精久久久久久久| www.欧美日韩| 亚洲日本青草视频在线怡红院 | 日韩一区在线播放| a级精品国产片在线观看| 中文字幕乱码亚洲精品一区| 成人av网址在线观看| 中文字幕一区二区三区不卡在线 | 国产乱子轮精品视频| 亚洲精品一区二区三区影院| 国内久久婷婷综合| 日本一区二区免费在线观看视频 | 亚洲男人的天堂一区二区| 99re视频精品| 五月婷婷色综合| 日韩女优电影在线观看| 精品夜夜嗨av一区二区三区| 欧美精品一区二区三区蜜桃| 东方欧美亚洲色图在线| 亚洲欧洲三级电影| 欧美日韩国产另类不卡| 日韩电影免费在线看| 精品久久久久久久人人人人传媒| 黄色日韩三级电影| 亚洲丝袜美腿综合| 欧美视频第二页| 寂寞少妇一区二区三区| 中文字幕中文字幕在线一区| 在线观看免费一区| 国产综合色产在线精品| 亚洲精品亚洲人成人网在线播放| 欧美视频精品在线| 国产老妇另类xxxxx| 中文字幕一区不卡| 日韩欧美国产三级| 91在线播放网址| 麻豆91在线观看| 国产精品传媒在线| 欧美精品精品一区| 成人免费视频网站在线观看| 午夜欧美2019年伦理| 国产欧美一区二区精品久导航| 色天使色偷偷av一区二区 | 日本人妖一区二区| 国产精品网曝门| 91精品国产综合久久精品麻豆 | 国产精品午夜久久| 久久久久亚洲综合| 欧美亚洲综合久久| 国产91丝袜在线播放| 亚洲成人av电影在线| 国产精品久久久99| 精品免费视频.| 欧美性色黄大片| 成人听书哪个软件好| 蜜臀99久久精品久久久久久软件| 亚洲色图色小说| 久久日一线二线三线suv| 色吧成人激情小说| 国产91丝袜在线播放九色| 蜜桃视频在线观看一区二区| 1000精品久久久久久久久| 久久久五月婷婷| 91精品国产入口| 精品视频123区在线观看| 91视频一区二区| 成人免费福利片| 青青草成人在线观看| 亚洲久草在线视频| 国产精品嫩草影院com| 久久影院午夜论| 日韩精品专区在线影院重磅| 欧美日韩成人综合| 欧美日韩久久久| 欧美在线不卡视频| 91精品1区2区| 色婷婷国产精品| 色婷婷一区二区| 白白色亚洲国产精品| 大尺度一区二区| 成人午夜激情片| 99精品久久99久久久久| 风间由美一区二区av101| 黄色资源网久久资源365| 久草中文综合在线| 国产精品一区二区三区网站| 国产在线精品一区二区夜色| 精品中文字幕一区二区| 加勒比av一区二区| 国产成人亚洲综合a∨婷婷| 国产成人自拍在线| 大美女一区二区三区| 91在线看国产| 在线视频综合导航| 欧美丝袜丝交足nylons图片| 精品视频资源站| 欧美一区二区三区喷汁尤物| 精品国产一区二区国模嫣然| 久久久国产午夜精品| 中文字幕在线观看一区二区| 一区二区三区在线视频免费观看| 亚洲国产一区二区三区| 免费成人在线视频观看| 国产在线播放一区二区三区| 成人avav影音| 欧美久久久久久久久久| 日韩欧美在线网站| 亚洲国产精品二十页| 亚洲品质自拍视频| 蜜桃视频第一区免费观看| 国产乱码精品1区2区3区| 成人国产精品免费网站| 欧美性猛片aaaaaaa做受| 日韩一级二级三级| 国产精品进线69影院| 性欧美大战久久久久久久久| 国内精品久久久久影院色| 成人性视频免费网站| 欧美剧在线免费观看网站| 久久嫩草精品久久久精品| 亚洲成人动漫在线免费观看| 狠狠久久亚洲欧美| 欧洲av在线精品| 国产日韩欧美精品综合| 亚洲成人av福利| 不卡的av中国片| 日韩一区二区三区免费看| 中日韩av电影| 久久精品国产亚洲a| 欧洲人成人精品| 国产精品丝袜久久久久久app| 五月婷婷激情综合网| 福利一区二区在线观看| 欧美日本国产视频| 中文字幕日韩欧美一区二区三区| 免费欧美高清视频| 欧美日韩在线一区二区| 国产精品国产a| 久久丁香综合五月国产三级网站| 91福利小视频| 国产精品毛片大码女人| 精品一区二区在线观看| 欧美日韩精品一二三区| 国产精品无遮挡| 国产福利91精品一区| 日韩精品一区二区三区在线 | 亚洲免费观看高清完整版在线| 久久国产三级精品| 欧美肥大bbwbbw高潮| 亚洲色图制服丝袜| 国产91精品久久久久久久网曝门| 日韩免费看网站| 日本三级亚洲精品| 欧美女孩性生活视频| 一个色综合av| 色婷婷久久综合| 国产精品久久久久久久岛一牛影视| 国产在线播放一区| 久久久99精品久久| 国产裸体歌舞团一区二区| 欧美一二三区精品| 亚洲第一成年网| 欧美猛男男办公室激情| 亚洲最新视频在线观看| 在线观看一区不卡| 午夜精品aaa| 日韩一区二区影院| 老司机免费视频一区二区三区| 日韩精品专区在线| 国产精品白丝jk白祙喷水网站 |