📄 ch372updowndlg.cpp
字号:
// CH372UpDownDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CH372UpDown.h"
#include "CH372UpDownDlg.h"
#include <dbt.h>
#include "CH372DLL.H"
#pragma comment (lib,"KmyanUsb")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
HWND WndHandle; //窗体句柄
HANDLE m_hDev;
//VOID CALLBACK CH372NOTIFYROUTINE( ULONG iEventStatus ); // 设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件
/////////////////////////////////////////////////////////////////////////////
// CCH372UpDownDlg dialog
CCH372UpDownDlg::CCH372UpDownDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCH372UpDownDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCH372UpDownDlg)
m_downdata2 = _T("");
m_downlen2 = 0;
m_date = _T("Down:0");
m_time = _T("Up:0");
m_UpNumb = 0;
m_hDev = INVALID_HANDLE_VALUE;
m_DevIndex = 0;
m_UpNumb = 0;
m_updata2 = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_HandleUp = INVALID_HANDLE_VALUE;
}
void CCH372UpDownDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCH372UpDownDlg)
DDX_Text(pDX, IDC_EDIT2_DOWNDATA, m_downdata2);
DDX_Text(pDX, IDC_EDIT2_DOWNLEN, m_downlen2);
DDX_Text(pDX, IDC_DownCount, m_date);
DDX_Text(pDX, IDC_UpCount, m_time);
DDX_Text(pDX, IDC_EDIT2_UPLEN, m_UpNumb);
DDX_Text(pDX, IDC_UPDATABuf, m_updata2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCH372UpDownDlg, CDialog)
//{{AFX_MSG_MAP(CCH372UpDownDlg)
ON_BN_CLICKED(IDC_OpenCH375Device, OnOpenCH375Device)
ON_BN_CLICKED(IDC_BUTTON2_DOWN, OnButton2Down)
ON_BN_CLICKED(IDC_ClearU2Data, OnClearU2Data)
ON_BN_CLICKED(IDC_ClearD2Data, OnClearD2Data)
ON_BN_CLICKED(IDC_BUTTON2_UP, OnButton2Up)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_DEVICECHANGE,CH372NOTIFYROUTINE)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCH372UpDownDlg message handlers
BOOL CCH372UpDownDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UINT i=0;
BOOL DrvInject = 0;
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
//初始化下传数据
m_downdata2 = _T("7E01FB9000001047534B3D494546514C37433F4CF2F247DDE7");
//m_downdata2 = _T("7E00FA900000107A686A686E403136332E636F6D01000183E7");
CString csStr = m_downdata2;
m_downlen2 = (csStr.GetLength())/2;
WndHandle = this->m_hWnd;
//UpdateData(false);
//MessageBox(m_downdata2);
SetDlgItemText(IDC_EDIT2_DOWNDATA, m_downdata2);
// TODO: Add extra initialization here
m_ComboBox = (CComboBox *)GetDlgItem(IDC_DeviceIndex);
for(i=0;i<16;i++)
{
CString strtem;
char tem[50]="";
sprintf(tem,"%d",i);
strtem = tem;
m_ComboBox->AddString(strtem);
//((CComboBox *)GetDlgItem(IDC_DeviceIndex))->AddString(strtem);
//CCH372UpDownDlg::SendDlgItemMessage(IDC_DeviceIndex,CB_ADDSTRING,0,(LPARAM) (LPCTSTR)str);
if(!DrvInject&&CH372OpenDevice(i)!=INVALID_HANDLE_VALUE){//初始化时检测是否有已插入的CH372/CH375设备
sprintf(tem,"检测到设备插入");
strtem=tem;
CCH372UpDownDlg::SetDlgItemText(IDC_DeviceStatus,strtem);
/*if (ERROR_SUCCESS != CH372SetDeviceNotify(0,NULL,CH372NOTIFYROUTINE))//启动指定序号设备插拔监视
{
MessageBox(_T("设置监控回调函数失败"));
}
else MessageBox(_T("设置监控回调函数成功"));*/
CH372CloseDevice(i);
m_ComboBox->SetCurSel(i);
DrvInject = 1;
}
}
//SendDlgItemMessage(WndHandle,IDC_DeviceIndex,CB_SETCURSEL,0,0); //初始化设备序号选项
//SendDlgItemMessage(WndHandle,IDC_DeviceIndex,CB_SETCURSEL, 0, 0);
return TRUE; // return TRUE unless you set the focus to a control
}
void CCH372UpDownDlg::OnOpenCH375Device() //打开设备--连接
{
// TODO: Add your control notification handler code here
ULONG DeviceID=0;
char WndTitle[50]="";
if(m_hDev) {
CloseHandle(m_hDev);
m_hDev = INVALID_HANDLE_VALUE;
m_DevIndex = 0;
}
UINT DrvId = m_ComboBox->GetCurSel();
RETAILMSG(1,(TEXT("Open device:%d \r\n"),DrvId));
m_hDev = CH372OpenDevice(DrvId);
m_DevIndex = DrvId;
if(m_hDev==INVALID_HANDLE_VALUE) {
CloseHandle(m_hDev);
MessageBox(L"Open Device Failed!");
}
m_HandleUp = AfxBeginThread(mHandleUp2,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
CString str;
DeviceID = CH372GetUsbID(DrvId); //获取当前打开的USB设备ID,返回数据中,低16位为厂商ID,高16位为产品ID,错误时返回全0(无效ID)
sprintf(WndTitle,"VID:%04X,PID:%04X",LOWORD(DeviceID),HIWORD(DeviceID));
str = WndTitle;
SetDlgItemText(IDC_DeviceInfor,str);
}
void CCH372UpDownDlg::OnButton2Down() //下传--发送数据
{
// TODO: Add your control notification handler code here
//UCHAR cmd[25] = {0x7E ,0x00 ,0xFA ,0x90 ,0x00 ,0x00 ,0x10 ,0x7A ,0x68 ,0x6A ,0x68 ,0x6E ,0x40 ,0x31 ,0x36 ,0x33 ,0x2E ,0x63 ,0x6F, 0x6D ,0x01 ,0x00 ,0x01 ,0x83 ,0xE7 };
DWORD dwLen = 1024;
DWORD dwCurLen = 0;
UCHAR buff[1024] = {0};
CString tstr;
//PUCHAR pstr;
/*UpdateData(TRUE);//将窗口里的数据赋值给个控件的相关变量;
str = m_downdata2;
RETAILMSG(1,(TEXT("Will down data:%s\r\n"), str ));
if(mLPCTStrtoVal(str,buff,1024)==((DWORD)-1))
RETAILMSG(1,(TEXT("Error Parameter\r\n")));*/
if(m_hDev == INVALID_HANDLE_VALUE) {
MessageBox(_T("请先打开设备!"),_T("DEBUG372"),MB_OK|MB_ICONSTOP);
return;
}
UpdateData(TRUE);//将窗口里的数据赋值给个控件的相关变量;
tstr = m_downdata2;
dwLen = mLPCTStrtoVal(tstr,buff,dwLen);
if(dwLen!=((DWORD)-1)){
m_downlen2 = dwLen;
dwCurLen = m_downlen2;
UpdateData(FALSE);//将各控件关联的变量的数据显示在窗口上;
if (CH372WriteData(m_DevIndex,buff,&dwCurLen) == ERROR_SUCCESS)
{
tstr.Empty();
tstr.Format(_T("%d"),dwCurLen);
m_date = tstr;
UpdateData(FALSE);//将各控件关联的变量的数据显示在窗口上;
}
else
MessageBox(L"USB数据传输错误!");
}
else
MessageBox(L"数据错误!");
}
//0823 将一个字符串中的2个字符为一个数据转换成数据串
BOOL CCH372UpDownDlg::mLPCTStrtoVal(LPCTSTR str, PUCHAR pDataBuff,DWORD dwBuffLen)
{
DWORD dwCurLen = 0;
TCHAR temp[3];
while (*str&&dwCurLen<dwBuffLen)
{
if(*str == _T('0')){
if (*(str+1)==_T('X')||*(str+1)==_T('x')) //16进制识别符,去掉
{
str+=2;
}
else if (!((_T('0')<=*(str+1) && *(str+1)<=_T('9'))||(_T('a')<=*(str+1) && *(str+1)<=_T('f'))||(_T('A')<=*(str+1) && *(str+1)<=_T('F'))))
{ //无效字符串
return (DWORD)-1;
}
else{
temp[0] = *str++;
temp[1] = *str;
temp[2] = 0;
*pDataBuff = (UCHAR)_tcstoul(temp,0,16);
str++;
dwCurLen++;
RETAILMSG(1,(TEXT("%02x "),*pDataBuff));
pDataBuff++;
}
}
else if (!((_T('0')<=*str && *str<=_T('9'))||(_T('a')<=*str && *str<=_T('f'))||(_T('A')<=*str && *str<=_T('F'))))
{ //无效字符串
str++;
}
else //有效字符数据
{
if (!((_T('0')<=*(str+1) && *(str+1)<=_T('9'))||(_T('a')<=*(str+1) && *(str+1)<=_T('f'))||(_T('A')<=*(str+1) && *(str+1)<=_T('F'))))
{ //无效字符串
return (DWORD)-1;
}
else{
temp[0] = *str++;
temp[1] = *str;
temp[2] = 0;
*pDataBuff = (UCHAR)_tcstoul(temp,0,16);
str++;
dwCurLen++;
RETAILMSG(1,(TEXT("%02x "),*pDataBuff));
pDataBuff++;
}
}
}
return (dwCurLen==dwBuffLen && *str) ? (DWORD)-1:dwCurLen;
}
BOOL CCH372UpDownDlg::mValtoLPCTStr(TCHAR *str,PUCHAR pDataBuff,DWORD dwCurLen)
{
DWORD i;
if ( pDataBuff && dwCurLen)
{
for (i=0;i<dwCurLen;i++)
{
swprintf(str+i*2,_T("%02x"),*pDataBuff++);
}
swprintf(str+dwCurLen*2,_T(" "));
RETAILMSG(1,(TEXT("mValtoLPCTStr:%s\r\n"),str));
return ERROR_SUCCESS;
}
else
{
RETAILMSG(1,(TEXT("mValtoLPCTStr:ERROR PARAMETER(\r\n")));
return (DWORD)-1;
}
}
void CCH372UpDownDlg::OnClearU2Data() //清空上传区数据
{
// TODO: Add your control notification handler code here
CString str;
str="";
SetDlgItemText(IDC_UPDATABuf,str);//0823
}
//0827
void CCH372UpDownDlg::OnClearD2Data()
{
// TODO: Add your control notification handler code here
//m_downlen2 =m_downdata2.GetLengt);
//UpdateData(false);
}
//0830
void CCH372UpDownDlg::OnButton2Up()
{
if (m_hDev)
{
if (m_HandleUp == INVALID_HANDLE_VALUE)
{
m_HandleUp = AfxBeginThread(mHandleUp2,0,THREAD_PRIORITY_NORMAL,0,0,NULL);
GetDlgItem(IDC_BUTTON2_UP)->EnableWindow(FALSE);
}
}
else
{
MessageBox(_T("请先打开设备!"),_T("DEBUG372"),MB_OK|MB_ICONSTOP);
}
}
/* 设备事件通知回调程序,在此程序里不宜作过多的操作,主要是因为中断服务程序优先级高,
不宜进行USB传输,通常只是发个消息或者置个全局变量通知主程序处理。*/
void CCH372UpDownDlg::CH372NOTIFYROUTINE( UINT message, WPARAM wParam, LPARAM lParam ){ //设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件
RETAILMSG(1,(TEXT("message:%x wParam:%x lParam:%x\r\n"),message,wParam,lParam));
if ( message == WM_DEVICECHANGE )
{
switch (wParam)
{
case DBT_DEVICEARRIVAL: //U盘插进来
{
}
break;
case DBT_DEVICEREMOVECOMPLETE:
break;
default:
break;
}
}
}
UINT mHandleUp2( LPVOID pParam )
{
ULONG len;
UCHAR buff[1024] = {0};
TCHAR Strtemp [1024]= {0};
DWORD StrIndex=0;
BOOL err;
CCH372UpDownDlg * mUpDownDlg = (CCH372UpDownDlg *)pParam;
while (1)
{ len = 1024;
if (CH372ReadData(mUpDownDlg->m_DevIndex, buff, &len) == ERROR_SUCCESS)
{
RETAILMSG( 1,(TEXT("CurrentReadNum: %d\r\n"),len));
if ((1024-StrIndex)<((len+1)*2))
{
StrIndex = 0;
}
err = mUpDownDlg->mValtoLPCTStr(Strtemp+StrIndex,buff,len);
if (err == ERROR_SUCCESS)
{
StrIndex = StrIndex+(len*2)+1;
if (StrIndex>1023)
{
StrIndex=0;
mUpDownDlg->m_updata2.Empty();
}
CString Strt = "";
RETAILMSG(1,(TEXT("mHandleUp2:%s\r\n"),Strtemp));
RETAILMSG(1,(TEXT("StrIndex:%d\r\n"),StrIndex));
mUpDownDlg->m_updata2 = Strtemp;
Strt.Format(_T("%d"),len);
mUpDownDlg->m_time = Strt;
mUpDownDlg->UpdateData(FALSE);
}
}
Sleep(100);
}
mUpDownDlg->m_HandleUp = INVALID_HANDLE_VALUE;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -