📄 usbdlg.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 + -