📄 ch372updowndlg.cpp
字号:
MessageBox("请先打开设备!","DEBUG372",MB_OK|MB_ICONSTOP);
return;
}
if(T2UHandle == INVALID_HANDLE_VALUE)
{
UCHAR DeviceName[128];
memcpy(&DeviceName[0],CH375GetDeviceName(mIndex),sizeof(DeviceName));
T2UHandle = CreateFile( (char *)&DeviceName[0], GENERIC_READ | GENERIC_WRITE, // 打开设备
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if(T2UHandle == INVALID_HANDLE_VALUE)
{
MessageBox("无法打开设备!","DEBUG372",MB_OK|MB_ICONSTOP);
return;
}
}
if(m_uplen2 > mCH375_PACKET_LENGTH*8 )
{
MessageBox("上传长度无效!","DEBUG372",MB_OK);
return;
}
//线程句柄有效,说明上次线程已自然退出
if(mTrdUp2 != INVALID_HANDLE_VALUE){
CloseHandle(mTrdUp2); //释放线程句柄
mTrdUp2 = NULL;
}
//建立上传线程
mTrdUp2 = AfxBeginThread(mThreadUp2,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
if(mTrdUp2)
{
m_trdup2 = TRUE; //线程启动标志
}
else
{
MessageBox("端点2上传线程启动失败","DEBUG372",MB_OK|MB_ICONSTOP);
m_trdup2 = FALSE;
return;
}
Sleep(10);
UpdateData(FALSE);
}
UINT mThreadUp2(LPVOID pParam) //端点2上传线程
{
UCHAR mBuf[mCH375_PACKET_LENGTH*8];
ULONG dlen,datalen;
CCH372UpDownDlg *pDlg = (CCH372UpDownDlg *)pParam;
pDlg->m_btnup2.EnableWindow(FALSE);
if(pDlg->m_open && pDlg->m_trdup2) //设备打开,线程启动
{
/**************在线程中用CreateFile打开设备,因为每个句柄同一时候只能执行一个API**************************/
if ( pDlg->T2UHandle != INVALID_HANDLE_VALUE ) { // 打开设备成功
datalen = min( pDlg->m_uplen2, sizeof(mBuf));
dlen = datalen;
if(CH375ReadData((ULONG)pDlg->T2UHandle,&mBuf[0],&dlen)){//操作成功输出数据
CHAR buffer[mCH375_PACKET_LENGTH*8*2+1];
ULONG i,j;
for(i=0,j=0;i<dlen;i++)
{
sprintf(&buffer[j],"%02X ",mBuf[i]);
j += 3;
}
buffer[j] = '\0';
ShowUpdata(buffer,j); //显示数据
{//更新长度显示
char tem[50]="";
UpCount=UpCount+dlen;
sprintf(tem,"Up: %d",UpCount);
SetDlgItemText(pDlg->m_hWnd,IDC_UpCount,tem);
}
}
else if ( !pDlg->m_close ) MessageBox(NULL,"端点2上传失败!如果设备断开过那么请先关闭本程序","DEBUG372",MB_OK|MB_ICONSTOP);
}
}
pDlg->m_trdup2 = FALSE;
pDlg->m_btnup2.EnableWindow(TRUE);
//ExitThread(0);
return 0;
}
void CCH372UpDownDlg::OnButton1Up() //端点1上传
{
CWinThread * mTrdUp1 = NULL;
UpdateData(TRUE);
if(!m_open) {
MessageBox("请先打开设备!","DEBUG372",MB_OK|MB_ICONSTOP);
return;
}
if(T1Handle == INVALID_HANDLE_VALUE)
{
UCHAR DeviceName[128];
memcpy(&DeviceName[0],CH375GetDeviceName(mIndex),sizeof(DeviceName));
T1Handle = CreateFile( (char *)&DeviceName[0], GENERIC_READ | GENERIC_WRITE, // 打开设备
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if(T1Handle == INVALID_HANDLE_VALUE)
{
MessageBox("无法打开设备!","DEBUG372",MB_OK|MB_ICONSTOP);
return;
}
}
if((m_uplen1 > 8))
{
MessageBox("中断上传长度长度不大于8","DEBUG372",MB_OK);
return;
}
//线程句柄有效,说明上次线程已退出
if(mTrdUp1 != INVALID_HANDLE_VALUE){
CloseHandle(mTrdUp1); //释放线程句柄
mTrdUp1 = NULL;
}
//建立线程
mTrdUp1 = AfxBeginThread(mThreadUp1,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
if(mTrdUp1)
{
m_trdup1 = TRUE; //线程启动标志
}
else
{
MessageBox("端点1上传线程启动失败","DEBUG372",MB_OK|MB_ICONSTOP);
m_trdup1 = FALSE;
return;
}
Sleep(10);
UpdateData(FALSE);
}
UINT mThreadUp1(LPVOID pParam) //端点1上传线程
{
UCHAR mBuf[mCH375_PACKET_LENGTH*8];
ULONG dlen,datalen;
CCH372UpDownDlg *pDlg = (CCH372UpDownDlg *)pParam;
pDlg->m_btnup1.EnableWindow(FALSE);
if(pDlg->m_open && pDlg->m_trdup1)
{
/**************在线程中用CreateFile打开设备,因为每个句柄同一时候只能执行一个API**************************/
if ( pDlg->T1Handle != INVALID_HANDLE_VALUE )
{
datalen = pDlg->m_uplen1;
dlen = datalen;
if(CH375ReadInter((ULONG)pDlg->T1Handle,&mBuf,&dlen))
{
CHAR buffer[mCH375_PACKET_LENGTH*8*3+1];
ULONG i,j;
for(i=0,j=0;i<dlen;i++)
{
sprintf(&buffer[j],"%02X ",mBuf[i]);
j += 3;
}
buffer[j] = '\0';
SetDlgItemText(pDlg->m_hWnd,IDC_EDIT1_UPDATA,buffer);
{
char tem[50]="";
InterCount=InterCount+dlen;
sprintf(tem,"Up: %d",InterCount);
SetDlgItemText(pDlg->m_hWnd,IDC_InterCount,tem);
}
}
else if ( !pDlg->m_close ) MessageBox(NULL,"端点1上传失败!如果设备断开过那么请先关闭本程序","DEBUG372",MB_OK|MB_ICONSTOP);
}
}
pDlg->m_trdup1 = FALSE;
pDlg->m_btnup1.EnableWindow(TRUE);
//ExitThread(0);
return 0;
}
PUCHAR CCH372UpDownDlg::mStrtoVal(PUCHAR str, ULONG strlen)
{
ULONG i,j;
ULONG len;
UCHAR strRev[mMAX_BUFFER_LENGTH];
if( strlen % 2 != 0 )
{
str[strlen] = 0;
strlen += 1;
}
len = strlen / 2;
for(i=0,j=0;i<strlen;i++,j++)
{
strRev[j] = (UCHAR)((mCharToBcd(str[i])<<4) + mCharToBcd(str[i+1]));
i++;
}
strRev[j]='\0';
memcpy( str,strRev,len);
return str;
}
UCHAR CCH372UpDownDlg::mCharToBcd(UCHAR iChar)
{
UCHAR mBCD;
if ( iChar >= '0' && iChar <= '9' ) mBCD = iChar -'0';
else if ( iChar >= 'A' && iChar <= 'F' ) mBCD = iChar - 'A' + 0x0a;
else if ( iChar >= 'a' && iChar <= 'f' ) mBCD = iChar - 'a' + 0x0a;
// else mBCD = 0xff;
else mBCD = 0;
return( mBCD );
}
void CCH372UpDownDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
mCloseWin();
CDialog::OnClose();
}
//退出程序关闭设备、线程、句柄
void CCH372UpDownDlg::mCloseWin()
{
m_close = TRUE;
if(m_open) // 退出未完成的线程,关闭设备
{
if(m_trddown2)
{
CH375AbortWrite(mIndex);
}
if(m_trdup2)
{
CH375AbortRead(mIndex);
}
if(m_trdup1)
{
CH375AbortInter(mIndex);
}
Sleep(50);
if ( T2DHandle != INVALID_HANDLE_VALUE )
{
CloseHandle( T2DHandle ); //关闭端点2下传句柄
T2DHandle = INVALID_HANDLE_VALUE;
}
if ( T2UHandle != INVALID_HANDLE_VALUE )
{
CloseHandle( T2UHandle ); //关闭端点2上传句柄
T2UHandle = INVALID_HANDLE_VALUE;
}
if ( T1Handle != INVALID_HANDLE_VALUE )
{
CloseHandle( T1Handle ); //关闭端点1句柄
T1Handle = INVALID_HANDLE_VALUE;
}
CH375CloseDevice(mIndex);
DevHandle = INVALID_HANDLE_VALUE;
m_open=FALSE;
Sleep(20);
::SetDlgItemText(WndHandle,IDC_OpenCH375Device,"打开设备&O");//等效于单击打开设备按钮
}
}
//打开设备
void CCH372UpDownDlg::OnOpenCH375Device()
{
char WndTitle[50]="";
ULONG DeviceID=0;
if(m_open){ //设备已被打开,先关闭
mCloseWin();
sprintf(WndTitle," 厂商ID:%04X,设备ID:%04X",0,0);
::SetDlgItemText(WndHandle,IDC_DeviceInfor,WndTitle);
m_open=FALSE;
}
else{
mIndex = ::SendDlgItemMessage(WndHandle,IDC_DeviceIndex,CB_GETCURSEL,0,0);
// 使用之前必须打开设备
DevHandle = CH375OpenDevice( mIndex ) ;
if (DevHandle == INVALID_HANDLE_VALUE ){
m_open = FALSE;
sprintf(WndTitle,"打开%d#设备失败!",mIndex);
MessageBox(WndTitle,"DEBUG372",MB_OK|MB_ICONSTOP);
return;
}
m_open = TRUE;
DeviceID = CH375GetUsbID(mIndex); //获取当前打开的USB设备ID,返回数据中,低16位为厂商ID,高16位为产品ID,错误时返回全0(无效ID)
sprintf(WndTitle," 厂商ID:%04X,设备ID:%04X",LOWORD(DeviceID),HIWORD(DeviceID));
::SetDlgItemText(WndHandle,IDC_DeviceInfor,WndTitle);
sprintf(WndTitle,"关闭%d#设备(&C)",mIndex);
::SetDlgItemText(WndHandle,IDC_OpenCH375Device,WndTitle);
}
return;
}
BOOL CCH372UpDownDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
CH375SetDeviceNotify(mIndex,NULL,NULL);//关闭设备插拔通知
if(m_open){ //关闭设备
mCloseWin();//释放先前打开设备的资源
}
return CDialog::DestroyWindow();
}
/* 设备事件通知回调程序,在此程序里不宜作过多的操作,主要是因为中断服务程序优先级高,
不宜进行USB传输,通常只是发个消息或者置个全局变量通知主程序处理。*/
VOID CALLBACK CH375NOTIFYROUTINE(
ULONG iEventStatus ){ //设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件
char tem[100]="";
if(iEventStatus==CH375_DEVICE_ARRIVAL){ //检测到设备插入事件
::sprintf(tem," 检测到有CH372/CH375设备已插入.");
::SetDlgItemText(WndHandle,IDC_DeviceStatus,tem);//等效于单击打开设备按钮
}
else if(iEventStatus==CH375_DEVICE_REMOVE){//检测到设备拔出事件
::sprintf(tem," 检测到有CH372/CH375设备已拔出.");
::SetDlgItemText(WndHandle,IDC_DeviceStatus,tem);//等效于单击打开设备按钮
if(DevHandle != INVALID_HANDLE_VALUE)
::SendDlgItemMessage(WndHandle,IDC_OpenCH375Device,BM_CLICK,0,0);//等效于单击打开设备按钮
}
return;
}
//清空下传数据
void CCH372UpDownDlg::OnClearD2Data()
{
{//清除累计计数
char tem[50]="";
DownCount=0;
sprintf(tem,"Down: %d",DownCount);
::SetDlgItemText(m_hWnd,IDC_DownCount,tem);
}
this->m_downdata2="";
UpdateData(FALSE);
return;
}
void CCH372UpDownDlg::OnClearU2Data()
{
{//清除累计计数
char tem[50]="";
UpCount=0;
sprintf(tem,"Up: %d",UpCount);
::SetDlgItemText(m_hWnd,IDC_UpCount,tem);
}
::SetDlgItemText(WndHandle,IDC_UPDATABuf,"");
return;
}
void CCH372UpDownDlg::OnClearU1Data()
{
{//清除累计计数
char tem[50]="";
InterCount=0;
sprintf(tem,"Down: %d",InterCount);
::SetDlgItemText(m_hWnd,IDC_InterCount,tem);
}
SetDlgItemText(IDC_EDIT1_UPDATA,"");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -