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

📄 usbulkctl.cpp

📁 USB通讯控件,Bulk通讯方式,可以直接从USB设备中读取数据保存为文件,或者把文件发送给USB设备,用于三星2410相关开发.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022,
0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072,
0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041,
0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2,
0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1,
0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1,
0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082,
0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192,
0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1,
0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1,
0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2,
0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151,
0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162,
0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132,
0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101,
0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312,
0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321,
0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371,
0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342,
0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1,
0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2,
0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2,
0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381,
0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291,
0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2,
0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2,
0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1,
0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252,
0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261,
0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231,
0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202
};

//	*计算长度为len的buf缓冲区中字节的CRC-16校验和
//	*返回的CRC-16校验和是字长型的无符号数
//	*crc是用于累计的CRC-16校验和
//	*buf是字节型的指针
//	*len是按字节buf的长度*/

unsigned int GetCRC16(unsigned char *buf,unsigned int len)
{
unsigned int i;
unsigned int crc;
unsigned int comb_val;

	crc = 0;
	comb_val = 0;
	for(i=0;i<len;i++)
	{
        comb_val = ((crc>>8) ^ *buf++) & 0xff;
        crc = (crc<<8) ^ crctab[comb_val];		
	}
	return (crc);
} 

BSTR CUsbulkCtrl::WriteUsbFile(LPCTSTR sPath, LPCTSTR dPath, LPCTSTR fileName) 
{
	CString strResult;
	CString filePath;
    HANDLE hFile;
    ULONG fileSize;
    USHORT cs=0;
    ////unsigned long threadResult;

	//int crc;
	DWORD res;
	UINT rxLength=64;
	ULONG respLen;
	char *rxBuf;

	filePath  = sPath;
	filePath.Replace("//","\\");
	if (filePath.Right(1)!="\\") 
		filePath =  filePath + "\\";
    filePath = filePath + fileName;
	hFile=CreateFile(filePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    if(hFile==INVALID_HANDLE_VALUE)
    {
		strResult =TEXT("Err: file is not exist\n") ;
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
    }
    
    fileSize=GetFileSize(hFile,NULL);

    if(fileSize>0x2800000)	//如果文件大于40M,提示用户写入的文件过大
    {
		strResult.Format(TEXT("Err: filesize is %d, must be less than 41943040.\n"),fileSize);
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
    }

	//发送目录名
	filePath  = dPath;
	filePath.Replace("\\","/");
	if (filePath.Right(1)!="/") 
		filePath =  filePath + "/";

	int NameLen = filePath.GetLength();
	
	//txBufSize = NameLen+10;
	txBufSize = NameLen+8;
    txBuf=(char *)malloc(txBufSize); 
	if(txBuf==NULL)
	{
		strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize;	//内存不够
		CloseHandle(hFile);
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
	}
	*((DWORD *)txBuf+0) = 0x0006101B;
	*((DWORD *)txBuf+1) = txBufSize-2;
	memcpy((char *)txBuf+8, filePath,NameLen);

	//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
	//*((WORD *)(txBuf+8+NameLen))=crc;   //attach checksum 

	res = SendToUSB64((void *)0);		//发送

	if (res==(int)txBufSize)	
	{

		rxBuf = (char *)malloc(rxLength);
		if(rxBuf==NULL)
		{
			strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength;	//内存不够
			CloseHandle(hFile);
			RecordLog("WriteUsbFile",fileName,strResult);
			return strResult.AllocSysString();
		}

		hRead = open_file(inPipe);
		
		UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);

		if (*((WORD *)rxBuf+0)!=0x4B4F)
		{
			strResult = "Err: Create Directory Failed!";	//创建目录失败
			CloseHandle(hFile);
			free((void *)rxBuf);
			RecordLog("WriteUsbFile",fileName,strResult);
			return strResult.AllocSysString();
		}

		free((void *)rxBuf);
		
		// close devices if needed
		//if(hRead != INVALID_HANDLE_VALUE)
		CloseHandle(hRead);
	}

	//发送文件名
	filePath  = fileName;

	NameLen = filePath.GetLength();
	
	//txBufSize = NameLen+10;
	txBufSize = NameLen+8;
    txBuf=(char *)malloc(txBufSize); 
	if(txBuf==NULL)
	{
		strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize;	//内存不够
		//strResult = "1";
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
	}

	*((DWORD *)txBuf+0) = 0x0002101B;
	*((DWORD *)txBuf+1) = txBufSize-2;
	memcpy((char *)txBuf+8, filePath,NameLen);

	//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
	//*((WORD *)(txBuf+8+NameLen))=crc;   //attach checksum 

	res = SendToUSB64((void *)0);		//发送
	//free((void *)txBuf);

	if (res==(int)txBufSize)	
	{

		rxBuf = (char *)malloc(rxLength);
		if(rxBuf==NULL)
		{
			strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength;	//内存不够
			//strResult = "1";
			RecordLog("WriteUsbFile",fileName,strResult);
			return strResult.AllocSysString();
		}

		hRead = open_file(inPipe);
		
		UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);

		if (*((WORD *)rxBuf+0)!=0x4B4F)
		{
			strResult = "Err: Create File Failed!";	//创建文件失败
			//strResult = "1";
			free((void *)rxBuf);
			RecordLog("WriteUsbFile",fileName,strResult);
			return strResult.AllocSysString();
		}

		free((void *)rxBuf);
		
		// close devices if needed
		//if(hRead != INVALID_HANDLE_VALUE)
		CloseHandle(hRead);
	}

	//发送写文件命令
	
    hWrite = open_file(outPipe);
    
    if(hWrite==INVALID_HANDLE_VALUE)
    {
		MessageBox(TEXT("Err: Can't open USB device.\n"),TEXT("Error"),
			MB_OK | MB_ICONINFORMATION );
		strResult = TEXT("Err:Can't open USB device.\n");
		//strResult = "1";
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
    }

	txBufSize=fileSize+10;
	txBufSize=fileSize+fileSize/60*4+8;
    txBuf=(char *)malloc(txBufSize); 

    if(txBuf==NULL)
    {
		strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize;
		//strResult = "1";
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
    }
	
	*((DWORD *)txBuf+0) = 0x0003101B;
	*((DWORD *)txBuf+1) = txBufSize-2;
	
	unsigned long readSize;
	//+++++++++++++++++ReadFile(hFile,(char *)txBuf+8,fileSize,&readSize,NULL);

	
	//+++++++++++++++++
	unsigned long i;
	unsigned long p=0;
	int pSize=60;
    for(i=0;i<fileSize;i++)
	{
		*((char *)txBuf+i+4*p) = 0x1B;
		*((char *)txBuf+i+4*p+1) = 0x11;
		*((char *)txBuf+i+4*p+2) = 0x01;
		*((char *)txBuf+i+4*p+3) = 0x40;

		if((i+pSize)<fileSize)
		{
			pSize = 60;
		}
		else
		{
			pSize = fileSize-i;
			*((char *)txBuf+i+4*p) = 0x1B;
			*((char *)txBuf+i+4*p+1) = 0x11;
			*((char *)txBuf+i+4*p+2) = 0x00;
			*((char *)txBuf+i+4*p+3) = pSize+4;
		}

		p++;

		ReadFile(hFile,(char *)txBuf+i+4*p,pSize,&readSize,NULL);
		i = i + pSize - 1;
	}
	readSize=fileSize;
	
	//-----------------

    if(readSize!=fileSize)    
    {
		strResult = TEXT("Err: Read File Error\n") ;
		CloseHandle(hFile);
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
     }

    iTxBuf=0;

    CloseHandle(hFile);

	//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
	//*((WORD *)(txBuf+8+fileSize))=crc;   //attach checksum 

////////////////////单线程方式开始
	//初始化进度框
	//
    void *txBlk;
    ULONG txBlkSize;
    DWORD nBytesWrite;

	_hDlgDownloadProgress=NULL;
	HINSTANCE hInstance=AfxGetInstanceHandle();
	CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),m_hWnd,DownloadProgressProc); //modaless
	InitDownloadProgress();
	
	DWORD txBufSize100=txBufSize/100;
	if(txBufSize100==0) txBufSize100=1;	

    while(1)
    {
 		CheckMessageQueue();
       if((txBufSize-iTxBuf) > TX_SIZE)
			txBlkSize=TX_SIZE;
		else
			txBlkSize=txBufSize-iTxBuf;
		
		txBlk=(void *)(txBuf+iTxBuf);
		if(!WriteFile(hWrite,txBlk,txBlkSize,&nBytesWrite,NULL)) 
		{
			strResult.Format("Err: Write %d\n",iTxBuf);
			break;
		}
		iTxBuf+=TX_SIZE;

		/*
		if((iTxBuf%0x100000)==0)
		{
			//延时1000毫秒,等待隔离器关闭文件
			DWORD dwStart = GetTickCount();
			DWORD dwEnd = dwStart;
			do
			{
				CheckMessageQueue();
				dwEnd = GetTickCount()-dwStart;
			}while(dwEnd <3000);
		}
		*/

		if(((iTxBuf/txBufSize100)%2)==1)
			DisplayDownloadProgress(iTxBuf/txBufSize100);

		if(downloadCanceled==1)break;	//download is canceled by user.
		
		if(iTxBuf>=txBufSize)break;
    }
		

	free((void *)txBuf);
	
	CloseHandle(hWrite);

	if(downloadCanceled==1)	//exit by user.
	{
		strResult = "Err: Write is canceled by user";
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
	}

	//接收Device返回的4F4B
	DisplayDownloadProgress(100);	//数据传输完成,进度条显示100%
	rxBuf = (char *)malloc(rxLength);
	if(rxBuf==NULL)
	{
		strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength;	//内存不够
		RecordLog("WriteUsbFile",fileName,strResult);
		return strResult.AllocSysString();
	}

	hRead = open_file(inPipe);
	
	UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);

	if (*((WORD *)rxBuf+0)!=0x4B4F)
	{
		strResult = "Err: Write USB Failed!";	//创建目录失败
		free((void *)rxBuf);
		RecordLog("WriteUsbFile",fileName,strResult);
		CloseHandle(hRead);
		CloseDownloadProgress();
		return strResult.AllocSysString();
	}

	free((void *)rxBuf);
	
	// close devices if needed
	//if(hRead != INVALID_HANDLE_VALUE)
	CloseHandle(hRead);
	//接收4F4B完成

	CloseDownloadProgress();

/////////////////单线程方式结束

/*****************************
    threadResult=_beginthread( (void (*)(void *))UsbTxFile,0x2000,(void *)0);
    //threadResult=_beginthread( (void (*)(void *))UsbTxFile64,0x2000,(void *)0);
    
    if(threadResult!=-1)
    {
		//Create the download progress dialogbox.
		HINSTANCE hInstance=AfxGetInstanceHandle();	//获得当前程序的实例句柄
		HWND hwnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),m_hWnd,DownloadProgressProc); //modaless
		if(NULL == hwnd){
			DWORD dwerr = GetLastError();   
		}   

		//ShowWindow(_hDlgDownloadProgress,SW_SHOW); 
		//isn't needed because the dialog box already has WS_VISIBLE attribute.
    }
    else
    {
		strResult =TEXT("Err: Can't creat a thread. Memory is not sufficient\n") ;
		//strResult = "1";
		free((void *)txBuf);
		return strResult.AllocSysString();
    }
	
    //The dialog box will be closed at the end of TxFile().
    //free(txBuf) & CloseHandle(hWrite) will be done in TxFile()
	//strResult =TEXT("OK\n") ;
//*****************************/
	strResult = "0";
	RecordLog("WriteUsbFile",fileName,strResult);
	return strResult.AllocSysString();
}

BSTR CUsbulkCtrl::ReadUsbFile(LPCTSTR sPath, LPCTSTR dPath, LPCTSTR fileName) 
{
	UINT rxLength=64;
	ULONG respLen;

	long success;
	char *rxBuf;
    void *txBlk;
    ULONG txBlkSize;

	CString filePath;
	CString strResult;
	//int crc;
	DWORD res;
	long nSumLength;

	CFile nTargetFile;
	CString tFileName;
	

	/*
	//获取文件大小
	nSumLength = -1;
	nSumLength = GetFileLength(sPath,fileName);
	if (nSumLength<0)
	{
		strResult = "Err: file is not exist.";	//源文件不存在
		//strResult = "1";
		RecordLog("ReadUsbFile",fileName,strResult);
		return strResult.AllocSysString();
	}
	*/

	//发送文件名(sPath+fileName)
	filePath  = sPath;
	if ((!filePath.IsEmpty()) && (filePath.Right(1)!="/"))	//路径名与文件名之间加"/"
		filePath  = filePath + "/";
	filePath = filePath + fileName;

	int NameLen = filePath.GetLength();
	
	//txBufSize = NameLen+10;
	txBufSize = NameLen+8;
    txBuf=(char *)malloc(txBufSize); 
	if(txBuf==NULL)
	{
		strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize;	//内存不够
		//strResult = "1";
		RecordLog("ReadUsbFile",fileName,strResult);
		return strResult.AllocSysString();
	}
	*((DWORD *)txBuf+0) = 0x0005101B;
	*((DWORD *)txBuf+1) = txBufSize-2;
	memcpy((char *)txBuf+8, filePath,NameLen);

	//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
	//*((WORD *)(txBuf+8+NameLen))=crc;   //attach checksum 

	res = SendToUSB64((void *)0);		//发送

	if (res==(int)txBufSize)	
	{

		rxBuf = (char *)malloc(rxLength);
		if(rxBuf==NULL)
		{
			strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength;	//内存不够
			//strResult = "1";
			RecordLog("ReadUsbFile",fileName,strResult);
			return strResult.AllocSysString();
		}

		hRead = open_file(inPipe);
		nSumLength = -1;
		
		UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);
		WORD crc = *((char *)rxBuf+*((char *)rxBuf+3)+0);
		WORD CRC = *((char *)rxBuf+*((char *)rxBuf+3)+1);
		crc = crc<<8 ;
		crc = (crc & 0xFF00) + (CRC & 0x00FF);
		CRC = GetCRC16((unsigned char *)rxBuf+0,*((char *)rxBuf+3));
		//Crc=(Crc>>8)+(Crc<<8);

⌨️ 快捷键说明

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