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

📄 mainfrm.cpp

📁 论文题目:基于数字信号处理器(DSP)的异步电机直接转矩控制研究 其中有软件的设计文档
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "Dsp7.h"
#include "MainFrm.h"

#include "conio.h"
#include "stdlib.h"
#include "ctype.h"
#include "Comdlg.h"
#include "Programdlg.h"
#include "fstream.h"
#include "Setdlg.h"
#include  "Paradlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_MENU_DATA, OnMenuData)
	ON_COMMAND(ID_MENU_HAND, OnMenuHand)
	ON_COMMAND(ID_MENU_PROGRAM, OnMenuProgram)
	ON_WM_TIMER()
	ON_COMMAND(ID_MENU_READ, OnMenuRead)
	ON_COMMAND(ID_MENU_EXE, OnMenuExe)
	ON_COMMAND(ID_MENU_SET, OnMenuSet)
	ON_UPDATE_COMMAND_UI(ID_MENU_DATA, OnUpdateMenuData)
	ON_UPDATE_COMMAND_UI(ID_MENU_EXE, OnUpdateMenuExe)
	ON_UPDATE_COMMAND_UI(ID_MENU_HAND, OnUpdateMenuHand)
	ON_UPDATE_COMMAND_UI(ID_MENU_PROGRAM, OnUpdateMenuProgram)
	ON_UPDATE_COMMAND_UI(ID_MENU_READ, OnUpdateMenuRead)
	ON_UPDATE_COMMAND_UI(ID_MENU_SET, OnUpdateMenuSet)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CStatusBar m_wndStatusBar;//状态栏对象
bool clickok=true;        //确定菜单是否选取
static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_SEPARATOR,           // status line indicator
	ID_SEPARATOR,           // status line indicator
	ID_SEPARATOR,           // status line indicator
	ID_SEPARATOR,           // status line indicator
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
	m_wndStatusBar.SetPaneInfo(1,0,SBPS_NORMAL,65);//设置状态栏信息
	m_wndStatusBar.SetPaneInfo(2,0,SBPS_NORMAL,80);
	m_wndStatusBar.SetPaneInfo(3,0,SBPS_NORMAL,65);
	m_wndStatusBar.SetPaneInfo(4,0,SBPS_NORMAL,80);
	m_wndStatusBar.SetPaneText(1,"总共字节:",true);
	m_wndStatusBar.SetPaneText(3,"完成字节:",true);
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
CComdlg datadlg;	//建立对话框对象 
static int COM=0x02f8;//串口
static int LSR=0x02fd;//线路状态寄存器
static int LCR=0x02fb;//线路控制寄存器
static int MSB=0x02f9;//除数寄存器高,低位
static int LSB=0x02f8;

void CMainFrame::OnMenuData() //建立发送参数对话框
{
	// TODO: Add your command handler code here
	clickok=false;
	CString str1=" ";//STR1 保存窗口字符
	char str2[100]="";
	int i=0,j=0,int_temp=0,k=0,temp=0;//
	int temp_hi;
	unsigned short m_temp[5];//用于保存指令,地址
	unsigned short m_para[10];//用于保存参数
	short result=datadlg.DoModal();
	if(result==IDOK)
	{	
	    for(i=0;i<3;i++)
		{m_temp[i]=0;}
//	if((datadlg.m_code=="")||(datadlg.m_init=="")||(datadlg.m_end==""))
//		{AfxMessageBox("输入不正确!!!"); clickok=true; goto end;}
	    m_temp[0]=0x50A0;		//起始标志字
	    sscanf(datadlg.m_code,"%04x",&(m_temp[1]));//将用户输入的字符
//	sscanf(datadlg.m_init,"%04x",&(m_temp[2]));//形式的指令,地址
//	sscanf(datadlg.m_end,"%04x",&(m_temp[3])); //等转化为数值??????????????
	    sscanf(datadlg.m_len,"%04x",&(m_temp[2]));
    }

	int len=m_temp[2]; //len是参数个数

	MessageBox("请输入要发送的参数.");

	CParadlg paradlg; //建立参数框对象
	short result1=paradlg.DoModal();
	if(result1=IDOK)
    {
	  sscanf(paradlg.m_para1,"%04x",&(m_para[0]));
	  sscanf(paradlg.m_para2,"%04x",&(m_para[1]));
	  sscanf(paradlg.m_para3,"%04x",&(m_para[2]));
	  sscanf(paradlg.m_para4,"%04x",&(m_para[3]));
	  sscanf(paradlg.m_para5,"%04x",&(m_para[4]));
	  sscanf(paradlg.m_para6,"%04x",&(m_para[5]));
	  sscanf(paradlg.m_para7,"%04x",&(m_para[6]));
	  sscanf(paradlg.m_para8,"%04x",&(m_para[7]));
	  sscanf(paradlg.m_para9,"%04x",&(m_para[8]));
	  sscanf(paradlg.m_para10,"%04x",&(m_para[9]));
    }
// 以下是调试内容
//	for(i=0;i<4;i++)
//	{ int temp_high;
//	  int temp_low; 
//	if(i==0) {temp_high=0x0050;
//	          temp_low=0x00a0;} 
//	if(i==1) {temp_high=0x0008;
//	          temp_low=0x0002;}
//	if(i==2) {temp_high=0x00b8;
//	          temp_low=0x0025;}
//	if(i==3)  {temp_high=0x0000;
//	          temp_low=0x0040;}
//	for(k=0;k<1E6;k++) 
//		{if(_inp(LSR)&0x020){_outp(COM,temp_high);break;}}
       
//	for(k=0;k<1E6;k++)//分高低字节发送
//		{if(_inp(LSR)&0x020){_outp(COM,temp_low);break;}}
//	}
//调试程序末

	for(i=0;i<3;i++) //发送指令码,数据长度(即参数个数).
		       //具体:共四个字节.即:50H,A0H,指令码(08H),参数个数.
	{   int temp;
		temp=m_temp[i];
		temp_hi=_lrotr(temp,8);
		//temp_lo=_lrotl(temp,8);
		if((i==1)||(i==2)) goto send_low;

		for(k=0;k<1E6;k++)//_lrotr()为右移函数  
		{if(_inp(LSR)&0x020){_outp(COM,temp_hi);break;}}
         Sleep(2000);

        send_low:
		for(k=0;k<1E6;k++)//分高低字节发送
	{if(_inp(LSR)&0x020){_outp(COM,temp);break;}}
		Sleep(2000);
//		temp_lo=0;
//		check=check+temp_hi+temp_lo;
	}

   	for(i=0;i<len;i++)  //发送参数(个数: len个)
	{
		temp=m_para[i];
		temp_hi=_lrotr(temp,8);
		//temp_lo=_lrotl(temp,8);

		for(k=0;k<1E6;k++)//分高低字节发送
		{if(_inp(LSR)&0x020){_outp(COM,temp_hi);break;}} //先送高八位

		for(k=0;k<1E6;k++)//_lrotr()为右移函数  
		{if(_inp(LSR)&0x020){_outp(COM,temp);break;}} //再送低八位
		
//		temp_lo=0;
//		check=check+temp_hi+temp_lo;
	}
		
		MessageBox("参数发送完毕!");

	//if(!isxdigit(str1[0])||!isxdigit(str1[len-1]))//?????????????????
	//{MessageBox("EER0R!!! INPUT DATA ARE ERROR!!");goto end;}
//	for(i=0;i<len;i++)   //发送数据
//	{
//		ch=str1[i];
//		if(isxdigit(ch))  //判断是否为十六进制数字符
//		{	
//			str2[j]=ch;   //是,则赋给STR2
//			j++;          //STR2增一
//		}
//		else if(isxdigit(str1[i-1]))//判断I前一个数????????????
//			{						//	是否为十六进制数字符
//			sscanf(str2,"%04x",&int_temp);//是,则取得一个十六进制数
//			temp_hi=_lrotr(temp,8);				//赋给中间变量
			//temp_lo=_lrotl(temp,8);
//			check=check+temp_hi+temp_lo;
//			for(k=0;k<1E5;k++)			//发送数据
//			{if(_inp(LSR)&0x020){_outp(COM,temp_hi);break;}} 
//			for(k=0;k<1E5;k++)
//			{if(_inp(LSR)&0x020){_outp(COM,temp);break;}}
//			j=0;						//STR2 恢复
//		}
//	}
//	check=!check+1;
	//_outp(COM,check);
//	AfxMessageBox("数据传送完毕!");
//	GetActiveView()->SetWindowText((CString)str2);
//end:i=0;}
	clickok=true;
}

void CMainFrame::OnMenuHand() 
{
	// TODO: Add your command handler code here
	clickok=false;
	int i=0;
	int wait1=0,wait2=0,wait3=0;   
	_inp(COM);
	_outp(COM,0xA0);//输出AOAA55
	for(i=0;i<1E7;i++)							//查询1000,000次
	{							// LSR: XXXX XXX1 可以接收数据
		if(_inp(LSR)&0x01){if(_inp(COM)==0x50)wait1=2;
							else goto there;	//第一个字节不为0X50
							break;}//握手结束
		if(i>1E7-3) goto there;
	}
	for(i=0;i<1E5;i++) //先判断是否可以发送数据 LSR:线路状态寄存器
	{if(_inp(LSR)&0x020){ _outp(COM,0xAA);break;}}
for(i=0;i<1E6;i++)
	{								//判断第二个字节是否为0X55	
		if(_inp(LSR)&0x01){if(_inp(COM)==0x55)wait2=2;break;}//?wait2=2
	}
	for(i=0;i<1E5;i++)					//XX1X XXXX 可以发送数据
	{if(_inp(LSR)&0x020){ _outp(COM,0x55);break;}}
	//等待大约5秒,是否有回复信号 5055AA  ???
       

	
	for(i=0;i<1E6;i++)
	{								//判断第三个字节是否为0XAA
		if(_inp(LSR)&0x01){if(_inp(COM)==0xAA)wait3=2;break;}//?wait3=2
	}

	if(wait2!=2||wait3!=2)//如果收到0X50,但未收到0X55AA
	{
		_outp(COM,0xEE);					//发送0XEE1234
		for(i=0;i<1E5;i++){if(_inp(LSR)&0x020){ _outp(COM,0x12);break;}}
		for(i=0;i<1E5;i++){if(_inp(LSR)&0x020){ _outp(COM,0x34);break;}}
		MessageBox("收到0X50,但未收到0X55AA!!!");
		goto enda;
	}
there:
	if(wait1==2&&wait2==2&&wait3==2)			//收到0X55AA//?wait1,2,3
	{	_outp(COM,0x55);							//输出AOAA55
		for(i=0;i<1E5;i++)					//XX1X XXXX 可以发送数据
		{if(_inp(LSR)&0x020){ _outp(COM,0xaa);break;}}
		MessageBox("通信成功!!!");					//成功
	}
	else MessageBox("未收到0X50,通信不成功!!!  请再试一次。");
enda:i=0;
	 clickok=true;
}
CProgramdlg programdlg;
void CMainFrame::OnMenuProgram() 
{
	// TODO: Add your command handler code here
	clickok=false;
	int temp_hi,temp_lo,check=0;
	int result=programdlg.DoModal();//建立执行程序对话框
if(result==IDOK){					//如果按确定	
	int m_temp[5],i=0,temp=0,k=0;
	for(i=0;i<2;i++)
		{m_temp[i]=0;}
	m_temp[0]=0x50A0;
	sscanf(programdlg.m_pcode,"%04x",&(m_temp[1]));//将字符转化为
	sscanf(programdlg.m_program,"%04x",&(m_temp[2]));//数值(0X)
	for(i=0;i<3;i++)   //将指令和起始地址发送
	{
		temp=m_temp[i];
		temp_hi=_lrotr(temp,8);
		temp_lo=_lrotl(temp,8);//这个可以不要 
		if(i==1) {temp_hi=2;} //表示数据包的长度
		for(k=0;k<1E5;k++)//_lrotr()为右移函数,先发高地址
		{if(_inp(LSR)&0x020){_outp(COM,temp_hi);break;}}
		for(k=0;k<1E5;k++)//分高低字节发送
		{if(_inp(LSR)&0x020){_outp(COM,temp);break;}}
//		check=check+temp_hi+temp_lo;
	}
//	check=!check+1;
   //_outp(COM,check);先不要校验
//	SetTimer(1,5000,NULL);
}else clickok=true;
}
void CMainFrame::OnTimer(UINT nIDEvent)//执行程序时每5秒查询一次 
{										//是否执行完
	// TODO: Add your message handler code here and/or call default
	int i=0,j=0,k=0;
	unsigned char in_char[5];
	unsigned char temp[5];
	temp[0]=0x50;
	temp[1]=0xA0;
	temp[2]=0xCC;
	temp[3]=0x12;
	temp[4]=0x34;
	if(_inp(LSR)&0x01)
	{
		KillTimer(1);
		clickok=true;
	for(i=0;i<5;i++)
		{
		for(j=0;j<1E4;j++)
			if(_inp(LSR)&0x01){in_char[i]=_inp(LSR);break;}
		}
	for(k=0;k<5;k++)//收到0X50A0CC1234,则程序成功完成
		{if(in_char[k]==temp[k])
		continue;
		else break;
		}
	if(k==5)MessageBox("程序已经顺利执行完成!");
	else MessageBox("错误,执行程序出错!!!");
	}
	CFrameWnd::OnTimer(nIDEvent);
}

int data_len=0;//LEN 为数据长度
CEditView *view;
CDocument *ment;
UINT MyReadThread(LPVOID pRParam );
void CMainFrame::OnMenuRead() 
{
	// TODO: Add your command handler code here
	clickok=false;
	view=(CEditView *)GetActiveView();//获得视的指针
	ment=GetActiveDocument();		//获得文档指针	
// int i=0,j=0,k=0,temp=0;
     
	int j=0,k=0,temp=0;
	int check=0,temp_hi,temp_lo; 
	short int result=datadlg.DoModal();//建立读取数据对话框

	int m_temp[4]={0};
	m_temp[0]=0x50A0;

	char  RBuffer[3]=" ";
	CString vstr="";
    char display_ch[10]="";
//	int inbyte[1000]; 这使得一次能读上来的数最多为1000个字节,即500(1f4h)个字
	int inbyte[10000];//一次能读上来的数最多为10000个字节,即5000(1388h)个字
 	int byte_temp;
//	unsigned char in_byte;
	unsigned char checksum=0;
    int i;
	

if(result==IDOK)
{
//调试程序开始
//[说明]:将TXD与RXD引脚短接,上位机发一个收一个(自发自收).
//[结果]:00H-FFH发送,接收全部正确
//     int inbyte[1000]; 增加定义一个变量
// 	int byte_temp;增加定义一个变量
//	    for(i=0;i<256;i++)
//	{
//		for(k=0;k<1E6;k++)
//		{if(_inp(LSR)&0x020){_outp(COM,i);break;}} 

//		for(k=0;k<1E6;k++)
//		{if(_inp(LSR)&0x01){inbyte[i]=_inp(COM);break;}}
//	}

	
//	   for(i=0;i<256;i++)
//	   {
//	   byte_temp=inbyte[i];


	   
//	  if(i!=0)
//	  { if((i%2)==0)vstr=vstr+"  ";	//每4个字符空两格显示
//	    if((i%20)==0)vstr=vstr+"\r\n";	//每10个换行
//	   }
     
//	 if(byte_temp<0x10) vstr=vstr+"0";
//     sprintf(display_ch,"%x",byte_temp);	//将所得数值转化为字符显示
//     vstr=vstr+display_ch;
	 
//   }

//	goto show_sth;
//调试程序结束

	if((datadlg.m_code=="")||(datadlg.m_init=="")||(datadlg.m_end==""))
		{AfxMessageBox("输入不正确!!!"); clickok=true; goto end;}
	sscanf(datadlg.m_code,"%04x",&(m_temp[1]));//将字符转化为
	sscanf(datadlg.m_init,"%04x",&(m_temp[2]));//十六进制数值
	sscanf(datadlg.m_end,"%04x",&(m_temp[3])); 
	//sscanf(datadlg.m_len,"%04x",&(m_temp[3]));//以16进制输入
	//_inp(COM);

	data_len=m_temp[3]-m_temp[2]+1;
	char display[10];
	sprintf(display,"%d",2*data_len+2);//以字节计算,加2表示数据头,以10进制显示
	m_wndStatusBar.SetPaneText(2,display,true);


	for(i=0;i<4;i++)   //将指令和起始,终止地址,长度发送
	{

⌨️ 快捷键说明

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