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

📄 ch372updowndlg.cpp

📁 CAN总线开发板源代码与原理图
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -