描述:
            这是一USB2.0接口与PC机进行双向通信的PC机方面的客户端VC++程序,,实验板上读出的EEPROM中的数据可以通过USB传输到PC机,并可以在PC机端的友好的界面中显示;PC机端通过键盘输入的数据可以通过USB传输到实验板的EEPROM中。可是我对这个程序还不太懂,我不明白它是怎样实现VC++和USB的通信的。好像没用到AxtiveX,也没用CreatFile()..,请各位大虾帮小女子注解一下。。有“//”都是不懂的地方,,万分感谢!!
这个程序对我的毕业设计来说非常重要~~~
define BUFFER_LEN	64     
class CE2PROM_1581Dlg;
typedef struct _THREADPARAM
{
	CE2PROM_1581Dlg* testDlg;
	unsigned char buffer[BUFFER_LEN];
	unsigned char startaddr;
	int length;
}THREADPARAM;
void CE2PROM_1581Dlg::OnButtonClearread() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	m_strReadData="";
	UpdateData(false);
}
void CE2PROM_1581Dlg::OnButtonRead() 
{
	// TODO: Add your control notification handler code here
	OnButtonClearread();
	UpdateData(true);
	if(m_nEditReadLength+m_nEditReadstartAddr>256)
	{
		MessageBox("所要读取的数据超过E2PROM地址区间,溢出。","错误",MB_OK|MB_ICONSTOP);		
		return;
	}
	m_readparam.length=m_nEditReadLength;          //
	m_readparam.startaddr=m_nEditReadstartAddr;     //
	UpdateData(false);
	m_readparam.testDlg=this;                    //
	EnableButton(false,false,false,false);       //
	CWinThread * wt = AfxBeginThread(             //
		BulkReadPipe, // thread function 
		&m_readparam); // argument to thread function 	
}
void CE2PROM_1581Dlg::OnButtonClearwrite() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	m_strWriteData="";
	UpdateData(false);
}
void CE2PROM_1581Dlg::OnButtonWrite() 
{
	// TODO: Add your control notification handler code here
	char tmp[200];
	int len;
	UpdateData(true);
	len=m_strWriteData.GetLength();       //
	if(len>192)             //why 192?
	{
		MessageBox("所写入的数据过长,每次最多只能写入64个字节的数据。","警告",MB_OK|MB_ICONWARNING);
		return;				
	}
	if(len==0)
	{
		MessageBox("请输入所要写入的数据。","警告",MB_OK|MB_ICONWARNING);
		return;		
	}
	if(len%3==1)
	{
		MessageBox("您所输入的数据格式不对,请检查是否漏掉了空格或有多余的空格或数据的位数不对。","错误",MB_OK|MB_ICONSTOP);
		return;
	}
	len=len/3+!(!(len%3));               //
	strcpy(tmp,(LPCTSTR)m_strWriteData);//
	if(strtodata((unsigned char*)tmp,m_writeparam.buffer,len)==1)//
	{
		MessageBox("您所输入的数据格式不对,其中有可能有些不是16进制数。","错误",MB_OK|MB_ICONSTOP);
		return;		
	}
	if(len+m_nEditWritestartAddr>256)
	{
		MessageBox("所要写入的数据超过E2PROM地址区间,溢出。","错误",MB_OK|MB_ICONSTOP);		
		return;
	}
	m_writeparam.length=len;
	m_writeparam.startaddr=m_nEditWritestartAddr;
	UpdateData(false);
	m_writeparam.testDlg=this;
	EnableButton(false,false,false,false);	  //
	CWinThread * wt = AfxBeginThread(           //
		BulkWritePipe, // thread function 
		&m_writeparam); // argument to thread function 	
}
void CE2PROM_1581Dlg::EnableButton(bool clearread, bool read, bool clearwrirte, bool write)
{
	GetDlgItem(IDC_BUTTON_CLEARREAD)->EnableWindow(clearread);
	GetDlgItem(IDC_BUTTON_READ)->EnableWindow(read);
	GetDlgItem(IDC_BUTTON_CLEARWRITE)->EnableWindow(clearwrirte);
	GetDlgItem(IDC_BUTTON_WRITE)->EnableWindow(write);
}
BOOL CE2PROM_1581Dlg::OnDeviceChange( UINT nEventType, DWORD dwData )
{
	Sleep(200);
	CheckBoard();
	return 0;
}
int CE2PROM_1581Dlg::CheckBoard()
{
	m_ControlIn.testDlg=this;
	ControlIn((void*)&m_ControlIn);    //
	return 0;
}
//-----------------------------------------------------
//参数:
//str:要转换的字符串
//data:储存转换过来的数据串
//len:数据长度
//函数功能:字符串转换为数据串
//-----------------------------------------------------
int CE2PROM_1581Dlg::strtodata(unsigned char *str, unsigned char *data,int len,int flag)
{
	unsigned char cTmp=0;
	int i=0;
	for(int j=0;j<len;j++)
	{
		if(chartoint(str[i++],&cTmp))        //
			return 1;
		data[j]=cTmp;
		if(chartoint(str[i++],&cTmp))     //
			return 1;
		data[j]=(data[j]<<4)+cTmp;       //
		if(flag==1)
			i++;
	}
	return 0;
}
//-----------------------------------------------------
//参数:
//chr:要转换的字符
//cint:储存转换过来的数据
//函数功能:字符转换为数据
//-----------------------------------------------------
int CE2PROM_1581Dlg::chartoint(unsigned char chr, unsigned char *cint)
{
	unsigned char cTmp;
	cTmp=chr-48;
	if(cTmp>=0&&cTmp<=9)
	{
		*cint=cTmp;
		return 0;
	}
	cTmp=chr-65;
	if(cTmp>=0&&cTmp<=5)
	{
		*cint=(cTmp+10);
		return 0;
	}
	cTmp=chr-97;
	if(cTmp>=0&&cTmp<=5)
	{
		*cint=(cTmp+10);
		return 0;
	}
	return 1;
}
void CE2PROM_1581Dlg::OnChangeEditReadlength()   //
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	// TODO: Add your control notification handler code here
	UpdateData(true);
	if(m_nEditReadLength<1)
		m_nEditReadLength=1;
	else if(m_nEditReadLength>64)
		m_nEditReadLength=64;
	UpdateData(false);
}
void CE2PROM_1581Dlg::OnChangeEditReadstartaddr() 
{
	// TODO: If this is a RICHEDIT control, the control will&nbs
 

