📄 mainfrm.cpp
字号:
// 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 + -