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

📄 usbulkctl.cpp

📁 USB通讯控件,Bulk通讯方式,可以直接从USB设备中读取数据保存为文件,或者把文件发送给USB设备,用于三星2410相关开发.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
									iClass = lFolder.Find("/",i);
									if(iClass<0) break;
									if(iClass>i) 
									{
										strXML = strXML + "\t</folder>\r\n";
									}
									i=iClass;
								}
							}
							else	//当前和上次路径有不同,则回到二者的父目录
							{
								//前面已经判断过二者是否互相包含,因此其相同部分肯定小于其中任意一方的长度
								CString t;
								for(i=0;i<lFolder.GetLength();i++)
								{
									if(lFolder[i]==iFolder[i])
									{
										t = t + lFolder[i];
									}
									else
									{
										//截取二者的父目录,t中可能包含文件夹名称前面相同部分,必须去掉
										for(i=t.GetLength()-1;i>=0;i--)
										{
											if(t[i]=='/')
											{
												t = t.Left(i);
												break;
											}
										}
										break;
									}
								}
								//关闭上个目录
								for(int i=t.GetLength();i<lFolder.GetLength();i++)
								{
									iClass = lFolder.Find("/",i);
									if(iClass<0) break;
									if(iClass>i) 
									{
										strXML = strXML + "\t</folder>\r\n";
									}
									i=iClass;
								}
								//建立新目录
								for(i=t.GetLength();i<iFolder.GetLength();i++)
								{
									iClass = iFolder.Find("/",i);
									if(iClass<0) break;
									if(iClass>i) 
									{
										lFolder = iFolder.Mid(i,iClass-i);
										if(lFolder=="table")
										{
											lFolder = lFolder;
										}
										strXML = strXML + "\t<folder name=\"" + lFolder + "\">\r\n";
									}
									i=iClass;
								}
							}
						}
						lFolder = iFolder;
					}

					strXML = strXML + "\t\t<file name=\"" + strTmp.Right(strTmp.GetLength()-iFolder.GetLength()) + "\"/>\r\n";
					strResult = strResult + strTmp + "," ;
					
					strTmp = "";
				}

				iTxBuf+=rxLength;
			}

			//处理隔离器错误报告
			if (*((WORD *)txBlk+0)==0x5245)
			{
				strResult.Format("%1x",*((char *)txBlk+4));
				strResult = "Err:" + strResult;
				iTxBuf+=rxLength;
				//break;
			}

			//包序号为0x00时,结束
			if (*((char *)txBlk+2)==0x00)
			{
				lClass = iFolder.GetLength();
				for(int i=1;i<lFolder.GetLength();i++)
				{
					iClass = lFolder.Find("/",i);
					if(iClass<0) break;
					if(iClass>i) 
					{
						strXML = strXML + "\t</folder>\r\n";
					}
					i=iClass;
				}
				strXML = strXML + "\t</folder>\r\n</SEARCHFILES>";
				res = strXML.GetLength();
				strResult = strXML;			//直接返回xml
				//*****dwNum = MultiByteToWideChar (CP_ACP, 0, strXML, -1, NULL, 0);
				//*****pwText = new wchar_t[dwNum];
				//*****MultiByteToWideChar (CP_ACP, 0, strXML, -1, pwText, dwNum);

				break;
			}
			
		}
		//处理数据
		CFile nTargetFile;
		CString tFileName;
		//$$$$$$$$$$$$$$CTime t1=CTime::GetCurrentTime();
		tFileName = "C:\\filename.xml";
		//$$$$$$$$$$$$$$tFileName.Format("C:\\Windows\\%04d-%02d-%02d.log",t1.GetYear(),t1.GetMonth(),t1.GetDay());

		if(nTargetFile.Open(_T(tFileName), CFile::modeCreate | CFile::modeWrite)==0)
		//$$$$$$$$$$$$$$if(nTargetFile.Open(_T(tFileName), CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite)==0)
		{
			strResult.Format("Err: Create file <%s> Fail.",tFileName);
			free((void *)rxBuf);
			//*****delete []pwText;
			RecordLog("SearchFiles",extName,strResult);
			return strResult.AllocSysString();
		}
		//*****WORD wSignature = 0xFEFF;	//Unicode文件标志
		//*****nTargetFile.Write(&wSignature, 2);
		//*****nTargetFile.Write(pwText,lstrlenW(pwText) * sizeof(WCHAR));
		//*****delete []pwText;
		nTargetFile.Write(strXML,strXML.GetLength());
		//$$$$$$$$$$$$$$strXML = t1.Format("%H:%M:%S") + "\tSearchFiles\t" + extName + "\tsuccess\r\n";
		//$$$$$$$$$$$$$$nTargetFile.SeekToEnd();
		nTargetFile.Write(strXML,strXML.GetLength());
		nTargetFile.Close();

		free((void *)rxBuf);

		// close devices if needed
		//if(hRead != INVALID_HANDLE_VALUE)
		CloseHandle(hRead);
	}

	//strResult.Replace("/","\\");		//返回带逗号的文本
	RecordLog("SearchFiles",extName,"0");
	return strResult.AllocSysString();
}

BSTR CUsbulkCtrl::GetFileName(LPCTSTR sDir, LPCTSTR extName) 
{
	CString strResult;
	CString strXML;
	CString strTmp;
	//int crc;
	DWORD res;
	int NameLen;

	strTmp = sDir;
	strXML = "<?xml version=\"1.0\" encoding=\"Unicode\" ?>\r\n<GETFILENAME>\r\n";
	//*****strXML = "<?xml version=\"1.0\" encoding=\"GB2312\" ?>\r\n<GETFILENAME>\r\n";
	strXML = strXML + "\t<dir name=\"\\" + strTmp + "\">\r\n";

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

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

	res = SendToUSB64((void *)0);		//发送文件名及文件路径
	DWORD dwNum;
	wchar_t *pwText;
	strTmp = "";
	if (res==(int)txBufSize)	
	{
		UINT success;
		UINT rxLength=64;
		ULONG respLen;
		char *rxBuf;
		void *txBlk;

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

		while(1)
		{
			txBlk=(void *)(rxBuf+iTxBuf);
			
 			success = ReadFile(hRead,txBlk,rxLength,&respLen,NULL);

			if (*((WORD *)txBlk+0)==0x4B4F)
			{
				NameLen = *((char *)txBlk+3)-4;
				for(int i=0;i<NameLen;i++)
				{
					strTmp = strTmp + *((char *)txBlk+4+i);
				}
				if ((*((char *)txBlk+2)!=0x01) && (strTmp.Find(extName)>=0)) 
				{
					strXML = strXML + "\t\t<file name=\"" + strTmp + "\"/>\r\n";
					strResult = strResult + strTmp + ",";
					strTmp = "";
				}
				else if(*((char *)txBlk+2)==0x02) strTmp = "";

				iTxBuf+=rxLength;
			}

			//处理隔离器错误报告
			if (*((WORD *)txBlk+0)==0x5245)
			{
				strResult.Format("%1x",*((char *)txBlk+4));
				strResult = "Err:" + strResult;
				iTxBuf+=rxLength;
				//break;
			}

			//包序号为0x00时,结束
			if (*((char *)txBlk+2)==0x00) 
			{

				strXML = strXML + "\t</dir>\r\n</GETFILENAME>";
				res = strXML.GetLength();
				dwNum = MultiByteToWideChar (CP_ACP, 0, strXML, -1, NULL, 0);
				
				pwText = new wchar_t[dwNum];
				MultiByteToWideChar (CP_ACP, 0, strXML, -1, pwText, dwNum);

				if ((!strResult.IsEmpty()) && (strResult.Right(1)!=",")) strResult = strResult + ",";

				break;
			}
		}

		//处理数据
		CFile nTargetFile;
		CString tFileName;
		tFileName = "C:\\filename.xml";

		if(nTargetFile.Open(_T(tFileName), CFile::modeCreate | CFile::modeWrite)==0)
		{
			strResult.Format("Err: Create file <%s> Fail.",tFileName);
			free((void *)rxBuf);
			delete []pwText;
			return strResult.AllocSysString();
		}
		WORD wSignature = 0xFEFF;	//Unicode文件标志
		nTargetFile.Write(&wSignature, 2);
		nTargetFile.Write(pwText,lstrlenW(pwText) * sizeof(WCHAR));
		delete []pwText;
		//nTargetFile.Write(rxBuf,iTxBuf);
		nTargetFile.Close();

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

	return strResult.AllocSysString();
}

BSTR CUsbulkCtrl::GetFolderName(LPCTSTR sDir) 
{
	CString strResult;
	CString strTmp;
	CString strXML;
	//int crc;
	DWORD dwNum;
	wchar_t *pwText;
	DWORD res;
	int NameLen;

	strTmp = sDir;
	strXML = "<?xml version=\"1.0\" encoding=\"Unicode\" ?>\r\n<GETFOLDERNAME>\r\n";
	strXML = strXML + "\t<dir name=\"\\" + strTmp + "\">\r\n";

	NameLen = strTmp.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";
		return strResult.AllocSysString();
	}
	*((DWORD *)txBuf+0) = 0x000B101B;
	*((DWORD *)txBuf+1) = txBufSize-2;
	memcpy((char *)txBuf+8, strTmp,NameLen);

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

	res = SendToUSB64((void *)0);		//发送文件名及文件路径

	strTmp = "";
	if (res==(int)txBufSize)	
	{
		UINT success;
		UINT rxLength=64;
		ULONG respLen;
		ULONG iLen;
		char *rxBuf;
		void *txBlk;

		rxBuf = (char *)malloc(rxLength*1000);
		if(rxBuf==NULL)
		{
			strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength*1000;	//内存不够
			return strResult.AllocSysString();
		}
		
		hRead = open_file(inPipe);
		iLen = 0;
		while(1)
		{
			
			txBlk=(void *)(rxBuf+iTxBuf);
			//txBlk = (void *)malloc(rxLength);
			
 			success = ReadFile(hRead,txBlk,rxLength,&respLen,NULL);

			if (*((WORD *)txBlk+0)==0x4B4F)
			{
				NameLen = *((char *)txBlk+3)-4;
				for(int i=0;i<NameLen;i++)
				{
					strTmp = strTmp + *((char *)txBlk+4+i);
				}
				if (*((char *)txBlk+2)==0x02)
				{
					strXML = strXML + "\t\t<folder name=\"" + strTmp + "\"/>\r\n";
					strResult = strResult + strTmp + ",";
					strTmp = "";
				}
				else if(*((char *)txBlk+2)==0x02) strTmp = "";

				iTxBuf+=rxLength;
			}

			//处理隔离器错误报告
			if (*((WORD *)txBlk+0)==0x5245)
			{
				strResult.Format("%1x",*((char *)txBlk+4));
				strResult = "Err:" + strResult;
				iTxBuf+=rxLength;
				//break;
			}

			//包序号为0x00时,结束
			if (*((char *)txBlk+2)==0x00) 
			{
				strXML = strXML + "\t</dir>\r\n</GETFOLDERNAME>";
				res = strXML.GetLength();
				dwNum = MultiByteToWideChar (CP_ACP, 0, strXML, -1, NULL, 0);
				
				pwText = new wchar_t[dwNum];
				MultiByteToWideChar (CP_ACP, 0, strXML, -1, pwText, dwNum);
				strResult = strResult + strTmp;
				if ((!strResult.IsEmpty()) && (strResult.Right(1)!=",")) strResult = strResult + ",";
				break;
			}
			
		}
		//处理数据
		CFile nTargetFile;
		CString tFileName;
		tFileName = "C:\\filename.xml";

		if(nTargetFile.Open(_T(tFileName), CFile::modeCreate | CFile::modeWrite)==0)
		{
			strResult.Format("Err: Create file <%s> Fail.",tFileName);
			free((void *)rxBuf);
			delete []pwText;
			return strResult.AllocSysString();
		}
		WORD wSignature = 0xFEFF;	//Unicode文件标志
		nTargetFile.Write(&wSignature, 2);
		nTargetFile.Write(pwText,lstrlenW(pwText) * sizeof(WCHAR));
		delete []pwText;
		nTargetFile.Close();

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

	return strResult.AllocSysString();}

BOOL CUsbulkCtrl::DeleteDir(LPCTSTR sDir) 
{
	CString filePath;
	//int crc;
	DWORD res;
	int NameLen;

	filePath = sDir;
	if(filePath.Right(1)!="/")
		filePath = filePath + "/";
	filePath.Replace("//","/");

	NameLen = filePath.GetLength();
	//txBufSize = NameLen+10;
	txBufSize = NameLen+8;
    txBuf=(char *)malloc(txBufSize); 
	if(txBuf==NULL)
	{
		return FALSE;
	}
	/*
	txBufSize = NameLen+10;
	
	int ii = 64 - (txBufSize % 64);
	txBufSize =  txBufSize +ii;

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

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

	//for (int i=0;i<ii;i++)
	//	*((char *)txBuf + NameLen + 10 + i) = 0x00;

	res = SendToUSB64((void *)0);		//发送文件名及文件路径

	if (res==(int)txBufSize)	
	{
		UINT success;
		UINT rxLength=64;
		ULONG respLen;
		char *rxBuf;

		rxBuf = (char *)malloc(rxLength);
		if(rxBuf==NULL)
		{
			return FALSE;
		}
		hRead = open_file(inPipe);
		
		success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);

		if (*((WORD *)rxBuf+0)==0x4B4F)
		{
			res = 0;
		}
		else
		{
			if (*((WORD *)rxBuf+0)==0x5245)
			{
				res = -1;
			}
			else
				res = -2;
		}


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

	if (res == 0)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

void CUsbulkCtrl::ResetDevice() 
{
	// TODO: Add your dispatch handler code here
	hRead = open_file(inPipe);
	reset_dev(hRead);
	CloseHandle(hRead);

}

⌨️ 快捷键说明

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