描述:
这是一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