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

📄 usbdlg.cpp

📁 使用菲利普的USBD12芯片以及89S52实现USB1.1的接口。这个程序是USB通信中的PC端的程序。采用VC2003.NET编译
💻 CPP
字号:
// USBDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "USB.h"
#include "USBDlg.h"
#include ".\usbdlg.h"
#include "EasyD12.h"  //add by lovelorn 添加EasyD12库
const double Precision=0.001 ;//  A/D转换精度 version 1.2
//const double Precision = 2.48/4096;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CUSBDlg 对话框



CUSBDlg::CUSBDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CUSBDlg::IDD, pParent)
	, m_dChannal1(0)
	, m_dChannal1_avr(0)
	, m_dChannal2(0)
	, m_dChannal2_avr(0)
	, m_dChannal3(0)
	, m_dChannal3_avr(0)
	, m_dChannal4(0)
	, m_dChannal4_avr(0)
	, m_dChannalMax1(0)
	, m_dChannalMax2(0)
	, m_dChannalMax3(0)
	, m_dChannalMax4(0)
	, m_dChannalMin1(0)
	, m_dChannalMin2(0)
	, m_dChannalMin3(0)
	, m_dChannalMin4(0)
	, m_lSampleTimes(0)
	, m_bLed0(FALSE)
	, m_bLED1(FALSE)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CUSBDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_CHANNAL1, m_dChannal1);
	DDX_Text(pDX, IDC_CHANNAL_AVR1, m_dChannal1_avr);
	DDX_Text(pDX, IDC_CHANNAL2, m_dChannal2);
	DDX_Text(pDX, IDC_CHANNAL_AVR2, m_dChannal2_avr);
	DDX_Text(pDX, IDC_CHANNAL3, m_dChannal3);
	DDX_Text(pDX, IDC_CHANNAL_AVR3, m_dChannal3_avr);
	DDX_Text(pDX, IDC_CHANNAL4, m_dChannal4);
	DDX_Text(pDX, IDC_CHANNAL_AVR4, m_dChannal4_avr);
	DDX_Text(pDX, IDC_CHANNAL_MAX1, m_dChannalMax1);
	DDX_Text(pDX, IDC_CHANNAL_MAX2, m_dChannalMax2);
	DDX_Text(pDX, IDC_CHANNAL_MAX3, m_dChannalMax3);
	DDX_Text(pDX, IDC_CHANNAL_MAX4, m_dChannalMax4);
	DDX_Text(pDX, IDC_CHANNAL_MIN1, m_dChannalMin1);
	DDX_Text(pDX, IDC_CHANNAL_MIN2, m_dChannalMin2);
	DDX_Text(pDX, IDC_CHANNAL_MIN3, m_dChannalMin3);
	DDX_Text(pDX, IDC_CHANNAL_MIN4, m_dChannalMin4);
	DDX_Text(pDX, IDC_SAMPLENUMBER, m_lSampleTimes);
	DDX_Check(pDX, IDC_LED0, m_bLed0);
	DDX_Check(pDX, IDC_LED1, m_bLED1);
	DDV_MinMaxDouble(pDX, m_dChannal1, 0.00000, 4.09600);
}

BEGIN_MESSAGE_MAP(CUSBDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_START, OnBnClickedStart)
	ON_BN_CLICKED(IDC_STOP, OnBnClickedStop)
	ON_BN_CLICKED(IDC_SAVE_CHANNAL1, OnBnClickedSaveChannal1)
	ON_BN_CLICKED(IDC_SAVE_CHANNAL2, OnBnClickedSaveChannal2)
	ON_BN_CLICKED(IDC_SAVE_CHANNAL3, OnBnClickedSaveChannal3)
	ON_BN_CLICKED(IDC_SAVE_CHANNAL4, OnBnClickedSaveChannal4)
	ON_BN_CLICKED(IDC_LED0, OnBnClickedLed0)
	ON_BN_CLICKED(IDC_LED1, OnBnClickedLed1)
END_MESSAGE_MAP()


// CUSBDlg 消息处理程序

BOOL CUSBDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将\“关于...\”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	ShowWindow(SW_MINIMIZE);

	// TODO: 在此添加额外的初始化代码

//	SetTimer(1,500,NULL);  //added by lovelorn 添加一个定时器,定时长度为500mS ,溢出处理函数为OnTimer();
	/*初始化各通道缓冲区*/
	csChannal1="";
	csChannal2="";
	csChannal3="";
	csChannal4="";


	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CUSBDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CUSBDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CUSBDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

/*****************************the follow are added by lovelorn****************************************/
void CUSBDlg::OnTimer(UINT nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	unsigned char Command[16];
	unsigned char DataBuf[16];
	memcpy(Command,"GetData",7);
	WritePort1(Command,7);
	if(ReadPort1(Command,16)) 
	{
		KillTimer(1);
		MessageBox("USB开发板未连接","ERROR",MB_OK);
		return ;
	}
	if(!memcmp(Command,"DataReady",9))
	{
		ReadPort2(DataBuf,16);
		DataProcess(DataBuf);
	}
	if(!memcmp(Command,"Error",5))
	{
		KillTimer(1);
		MessageBox("数据未准备好","ERROR",MB_OK);
		return;
	}
	UpdateData(FALSE);

	CDialog::OnTimer(nIDEvent);
}

void CUSBDlg::OnBnClickedStart()
{
	// TODO: 在此添加控件通知处理程序代码
/*	unsigned char Command[16];
	memcpy(Command,"Start",5);
	WritePort1(Command,5);
	ReadPort1(Command,16);
	if(memcmp(Command,"Started",7))
	{
		MessageBox("系统启动失败","Error",MB_OK);
		return;
	}*/
	SetTimer(1,20,NULL);//启动定时器1,定时长度为500mS
}

void CUSBDlg::OnBnClickedStop()
{
	// TODO: 在此添加控件通知处理程序代码
	KillTimer(1);
}

// 对从EndPoint2收到的数据进行处理
void CUSBDlg::DataProcess(unsigned char DataBuf[16])
{
	m_lSampleTimes+=1;//采样次数加1
	unsigned char sum=0;//校验和
	for(int i=2;i<15;i++)
	{
		sum+=DataBuf[i];//求和
	}
	if(DataBuf[0]!=0x55||DataBuf[1]!=0xAA)//如果起始两个字节内容不是0x55 0xAA则表明数据格式错误
	{
		KillTimer(1);
        MessageBox("数据格式错误","Error",MB_OK);
		return ;
	}
	if(sum!=DataBuf[15])//判断校验和是否出错
	{
		KillTimer(1);
		MessageBox("数据校验和错误","Error",MB_OK);
		return ;
	}
	csChannal1+=HexToString(DataBuf[2]);//将通道1的数据存储到通道1缓冲区中,数据低字节在前,高字节在后
	csChannal1+="-";
	csChannal1+=HexToString(DataBuf[3]);
	csChannal1+=" ";//两次数据之间用空格隔开
	csChannal2+=HexToString(DataBuf[4]);//将通道2的数据存储到通道2缓冲区中
	csChannal2+="-";
	csChannal2+=HexToString(DataBuf[5]);
	csChannal2+=" ";//两次数据之间用空格隔开
	csChannal3+=HexToString(DataBuf[6]);//将通道3的数据存储到通道3缓冲区中
	csChannal3+="-";
	csChannal3+=HexToString(DataBuf[7]);
	csChannal3+=" ";//两次数据之间用空格隔开
	csChannal4+=HexToString(DataBuf[8]);//将通道4的数据存储到通道4缓冲区中
	csChannal4+="-";
	csChannal4+=HexToString(DataBuf[9]);
	csChannal4+="  ";//两次数据之间用空格隔开
	
	unsigned int Value[4];
	for(int i=0;i<4;i++)//将两个字节的内容转换成一个int
	{
		Value[i]=DataBuf[i*2+2];
		Value[i]+=(DataBuf[i*2+3]*256);
	}
	if(m_lSampleTimes>1)//计算平均值
	{
		m_dChannal1_avr=(m_dChannal1_avr*(m_lSampleTimes-1)+Value[0]*Precision)/m_lSampleTimes;
		m_dChannal2_avr=(m_dChannal2_avr*(m_lSampleTimes-1)+Value[1]*Precision)/m_lSampleTimes;
		m_dChannal3_avr=(m_dChannal3_avr*(m_lSampleTimes-1)+Value[2]*Precision)/m_lSampleTimes;
		m_dChannal4_avr=(m_dChannal4_avr*(m_lSampleTimes-1)+Value[3]*Precision)/m_lSampleTimes;
	}
//计算最大值和最小值,以及当前值
	m_dChannal1=Value[0]*Precision;
	m_dChannalMax1=( m_dChannal1>m_dChannalMax1 ? m_dChannal1 : m_dChannalMax1 );
	m_dChannalMin1=( m_dChannal1<m_dChannalMin1 ? m_dChannal1 : m_dChannalMin1 );

	m_dChannal2=Value[1]*Precision;
	m_dChannalMax2=( m_dChannal2>m_dChannalMax2 ? m_dChannal2 : m_dChannalMax2 );
	m_dChannalMin2=( m_dChannal2<m_dChannalMin2 ? m_dChannal2 : m_dChannalMin2 );

	m_dChannal3=Value[2]*Precision;
	m_dChannalMax3=( m_dChannal3>m_dChannalMax3 ? m_dChannal3 : m_dChannalMax3 );
	m_dChannalMin3=( m_dChannal3<m_dChannalMin3 ? m_dChannal3 : m_dChannalMin3 );

	m_dChannal4=Value[3]*Precision;
	m_dChannalMax4=( m_dChannal4>m_dChannalMax4 ? m_dChannal4 : m_dChannalMax4 );
	m_dChannalMin4=( m_dChannal4<m_dChannalMin4 ? m_dChannal4 : m_dChannalMin4 );

	if(m_lSampleTimes==1)
	{
		m_dChannal1_avr=m_dChannal1;
		m_dChannal2_avr=m_dChannal2;
		m_dChannal3_avr=m_dChannal3;
		m_dChannal4_avr=m_dChannal4;
	}
	if(m_lSampleTimes==1)//最小值赋初始
	{
		m_dChannalMin1=m_dChannal1;
		m_dChannalMin2=m_dChannal2;
		m_dChannalMin3=m_dChannal3;
		m_dChannalMin4=m_dChannal4;
	}
}

void CUSBDlg::OnBnClickedSaveChannal1()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog FileDlg(FALSE,NULL,NULL,OFN_OVERWRITEPROMPT,"USB数据文件(*.txt)|*.txt||");
	if(FileDlg.DoModal()==IDCANCEL)
		return ;
	CStdioFile File1;
	CString strFileName=FileDlg.GetPathName();
	File1.SetFilePath(strFileName);
	strFileName=FileDlg.GetFileName();
	File1.Open(strFileName,CFile::modeCreate|CFile::modeWrite|CFile::typeText);
	File1.WriteString(csChannal1);
	File1.Close();
}

void CUSBDlg::OnBnClickedSaveChannal2()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog FileDlg(FALSE,NULL,NULL,OFN_OVERWRITEPROMPT,"USB数据文件(*.txt)|*.txt||");
	if(FileDlg.DoModal()==IDCANCEL)
		return ;
	CStdioFile File1;
	CString strFileName=FileDlg.GetPathName();
	File1.SetFilePath(strFileName);
	strFileName=FileDlg.GetFileName();
	File1.Open(strFileName,CFile::modeCreate|CFile::modeWrite|CFile::typeText);
	File1.WriteString(csChannal2);
	File1.Close();
}

void CUSBDlg::OnBnClickedSaveChannal3()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog FileDlg(FALSE,NULL,NULL,OFN_OVERWRITEPROMPT,"USB数据文件(*.txt)|*.txt||");
	if(FileDlg.DoModal()==IDCANCEL)
		return ;
	CStdioFile File1;
	CString strFileName=FileDlg.GetPathName();
	File1.SetFilePath(strFileName);
	strFileName=FileDlg.GetFileName();
	File1.Open(strFileName,CFile::modeCreate|CFile::modeWrite|CFile::typeText);
	File1.WriteString(csChannal3);
	File1.Close();
}

void CUSBDlg::OnBnClickedSaveChannal4()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog FileDlg(FALSE,NULL,NULL,OFN_OVERWRITEPROMPT,"USB数据文件(*.txt)|*.txt||");
	if(FileDlg.DoModal()==IDCANCEL)
		return ;
	CStdioFile File1;
	CString strFileName=FileDlg.GetPathName();
	File1.SetFilePath(strFileName);
	strFileName=FileDlg.GetFileName();
	File1.Open(strFileName,CFile::modeCreate|CFile::modeWrite|CFile::typeText);
	File1.WriteString(csChannal4);
	File1.Close();
}

// 将一个unsigned char str转变成用两个字节表示的十六进制,比如str=0xAF 则返回 字符串AF
CString CUSBDlg::HexToString(unsigned char str)
{
	CString result;
	char Table[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	result=Table[str/16];
	result+=Table[str%16];
	return result;
}

void CUSBDlg::OnBnClickedLed0()//LED0控制程序
{
	// TODO: 在此添加控件通知处理程序代码
	unsigned char ucCommand[16];
    UpdateData(TRUE);
	if(m_bLed0)
	{
		memcpy(ucCommand,"LED0_ON",7);
		WritePort1(ucCommand,7);
	}
	if(!m_bLed0)
	{
		memcpy(ucCommand,"LED0_OFF",8);
		WritePort1(ucCommand,8);
	}
	ReadPort1(ucCommand,16);
	if(memcmp(ucCommand,"LEDOK",5))
	{
		MessageBox("USB开发板未连接","Error",MB_OK);
		m_bLed0=0;
		UpdateData(FALSE);
	}
}

void CUSBDlg::OnBnClickedLed1()//LED1控制程序
{
	// TODO: 在此添加控件通知处理程序代码
	unsigned char ucCommand[16];
    UpdateData(TRUE);
	if(m_bLED1)
	{
		memcpy(ucCommand,"LED1_ON",7);
		WritePort1(ucCommand,7);
	}
	if(!m_bLED1)
	{
		memcpy(ucCommand,"LED1_OFF",8);
		WritePort1(ucCommand,8);
	}
	ReadPort1(ucCommand,16);
	if(memcmp(ucCommand,"LEDOK",5))
	{
		MessageBox("USB开发板未连接","Error",MB_OK);
		m_bLED1=0;
		UpdateData(FALSE);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -