📄 prg0.cpp
字号:
// Prg0.cpp : implementation file
//
#include "stdafx.h"
#include "prgx.h"
#include "Prg0.h"
#include "PrgDlg0.h"
#include "FileAcess.h"
#include "EraseSel.h"
#include "RWset.h"
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#include <iostream.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPrg0 dialog
CPrg0::CPrg0(CWnd* pParent /*=NULL*/)
: CDialog(CPrg0::IDD, pParent)
{
//{{AFX_DATA_INIT(CPrg0)
m_Dsp = _T("");
m_DspState = _T("缓冲区没有数据");
m_DspDeviceInf = _T(" FLASH: 29LV160T 厂商代码: 器件ID: ");
m_ProgressNum = _T("");
//}}AFX_DATA_INIT
}
void CPrg0::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPrg0)
DDX_Control(pDX, IDC_STATES, m_DspStCtl);
DDX_Control(pDX, IDC_INFOX, m_DspDeviceInfoCtl);
DDX_Control(pDX, IDC_PROGRESS1, m_Progr);
DDX_Text(pDX, IDC_BUF, m_Dsp);
DDV_MaxChars(pDX, m_Dsp, 100000000);
DDX_Text(pDX, IDC_STATES, m_DspState);
DDX_Text(pDX, IDC_INFOX, m_DspDeviceInf);
DDX_Text(pDX, IDC_STATIC7, m_ProgressNum);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPrg0, CDialog)
//{{AFX_MSG_MAP(CPrg0)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_OPENFILE, OnOpenfile)
ON_BN_CLICKED(IDC_SAVEFILE, OnSavefile)
ON_BN_CLICKED(IDC_TESTCOMM, OnTestcomm)
ON_BN_CLICKED(IDC_READ, OnRead)
ON_BN_CLICKED(IDC_ERASE, OnErase)
ON_BN_CLICKED(IDC_PROG, OnProg)
ON_BN_CLICKED(IDC_NEXTPAGE, OnNextpage)
ON_BN_CLICKED(IDC_LASTPAGE, OnLastpage)
ON_BN_CLICKED(IDC_CLEARFILEBUF, OnClearfilebuf)
ON_BN_CLICKED(IDC_LOCATEBUF, OnLocatebuf)
ON_BN_CLICKED(IDC_VERIFY, OnVerify)
ON_BN_CLICKED(IDC_STOPX, OnStopx)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPrg0 message handlers
BOOL CPrg0::OnInitDialog()
{
CDialog::OnInitDialog();
// m_Progr.SetWindowText("9999999999999");
m_ProgressNum=_T("");
w=(BYTE *)malloc(MAXFILELEN); //最大长度
if(!w)
ext:
{AfxMessageBox("内存不足,请退出部分应用程序后在运行本程序。");
return FALSE;
}
r=(BYTE *)malloc(MAXFILELEN); //最大长度
if(!r)
{//AfxMessageBox("内存不足,请退出部分应用程序后再运行本程序。");
free(w);
goto ext;
// return FALSE;
}
Dsp_flag=0;
Dsp_Cnt=0;
fstart=1;
rfile_flag=wfile_flag=0;
Cur_FilePtr=Cur_RDataPtr=0;
MaxLen=Cur_Ptr=0;
FileLen=RDataLen=0;
in_erase=in_prgF=in_readF=0;
m_Progr.SetRange(0,100);
Cur_progressPtr=0;
m_Progr.SetPos(0);
b_FOpen=(CButton *)GetDlgItem(IDC_OPENFILE);
b_CommTest=(CButton *)GetDlgItem(IDC_TESTCOMM);
b_RFlash=(CButton *)GetDlgItem(IDC_READ);
b_WFlash=(CButton *)GetDlgItem(IDC_PROG);
b_EFlash=(CButton *)GetDlgItem(IDC_ERASE);
b_FSave=(CButton *)GetDlgItem(IDC_SAVEFILE);
b_BufClr=(CButton *)GetDlgItem(IDC_CLEARFILEBUF);
b_BufLocate=(CButton *)GetDlgItem(IDC_LOCATEBUF);
b_Verify=(CButton *)GetDlgItem(IDC_VERIFY);
b_Stop=(CButton *)GetDlgItem(IDC_STOPX);
b_NextPage=(CButton *)GetDlgItem(IDC_NEXTPAGE);
b_LastPage=(CButton *)GetDlgItem(IDC_LASTPAGE);
B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=1;
B_FSave=B_BufClr=B_BufLocate=B_Verify=B_Stop=B_NextPage=B_LastPage=0;
DspButton();
UpdateData(FALSE);
SetTimer(111,50,0); //
return TRUE;
}
void CPrg0::OnTimer(UINT nIDEvent)
{
CDialog::OnTimer(nIDEvent);
if(fstart)
{CPrgDlg0 Dlg;
KillTimer(nIDEvent);
fstart=0;
Dlg.flag=1; //init comm232
Dlg.prg=this;
int r=Dlg.DoModal();
if(r!=IDOK){comm_OK=0;}//CDialog::OnCancel();}
else comm_OK=1;
SetTimer(111,50,0);
return;
}
if(in_erase || in_prgF || in_readF)
{ TmOut--;
if(!TmOut)
{tmp=m_DspState;
Stopx(1);
KillTimer(nIDEvent);
AfxMessageBox("超时错误!\n\n操作终止。\n");
SetTimer(111,50,0);
}
else {KillTimer(nIDEvent);
Rcv();
if(in_erase)SetTimer(111,1000,0);
else SetTimer(111,1,0);
}
}
if(Dsp_flag)
{ Dsp_Cnt++;
if(Dsp_Cnt>100)
{m_DspState = _T("请选择操作类型");
Dsp_flag=0; Dsp_Cnt=0;
m_Progr.SetPos(0);
DspID(0);
UpdateData(FALSE);
}
}
/* if(in_erase)
{ DataLenx+=50;
Cur_progressPtr=(int)(DataLenx*100/DataLen);
}
else if(in_prgF)
{
}
else if(in_readF)
{
}
*/ //if(in_erase || in_prgF || in_readF)m_Progr.SetPos(0);
// UpdateData(FALSE);
}
void CPrg0::OnOpenfile()
{
// tmp = _T("请选择操作类型");
m_Progr.SetPos(0);
Dsp_flag=0;
CFileAcess dlg;
dlg.flag=1;
tmp=m_DspState;
m_DspState = _T("执行打开文件操作");
UpdateData(FALSE);
int r=dlg.DoModal();
if(r!=IDOK)
{if(in_erase || in_prgF || in_readF)m_DspState = tmp;//_T("请选择操作类型");
else m_DspState = _T("请选择操作类型");
UpdateData(FALSE);
return;
}
tmp = _T("请选择操作类型");
FileName=dlg.m_FileName;
FileLen=dlg.FileLen;
HANDLE hd;
DWORD lenx;
m_DspState = _T("正在打开文件...");
UpdateData(FALSE);
hd=CreateFile((LPCTSTR)FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hd!=INVALID_HANDLE_VALUE)
{
ReadFile(hd,(void*)w,FileLen,&lenx,NULL);
CloseHandle(hd);
}
else {AfxMessageBox("文件操作错误!!\n\n无法完成文件装载。"); m_DspState = _T("文件操作发生错误!"); UpdateData(FALSE); return;}
/**********************************************************
BYTE dd=0;
for(int i=0;i<10000;i++)
{w[i]=dd;
dd++;
}
FileLen=10000;
*///**********************************************************
m_DspState = _T("文件装载完毕。");
Cur_FilePtr=0;
Cur_RDataPtr=0;
Cur_Ptr=0;
wfile_flag=1;
MaxLen=__max(FileLen,RDataLen);
OnDspFile();
if(FileLen>(MAXLINESINONEPAGE*MAXBYTESINONELINE))B_NextPage=1;
B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=1;
B_BufClr=B_BufLocate=1;
DspButton();
// Dsp_flag=1;
// AfxMessageBox(FileName);
}
void CPrg0::OnSavefile()
{
HANDLE hd;
DWORD lenx;
hd=CreateFile("c:\\flash.bin",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hd!=INVALID_HANDLE_VALUE)
{
WriteFile(hd,(void*)r,RDataLen,&lenx,NULL);
CloseHandle(hd);
}
AfxMessageBox("数据已经保存到文件:\n c:\\flash.bin\n");
}
void CPrg0::OnTestcomm()
{
Dsp_flag=0;
CPrgDlg0 Dlg;
Dlg.flag=0;
Dlg.prg=this;
m_DspState = _T("执行通讯测试操作");
UpdateData(FALSE);
int r=Dlg.DoModal(); //don't init comm232
if(r==IDOK)comm_OK=1;
else comm_OK=0;
m_DspState = _T("通讯测试完毕");
UpdateData(FALSE);
// Dsp_flag=1;
}
void CPrg0::OnRead()
{
Dsp_flag=0;
tmp = _T("请选择操作类型");
m_Progr.SetPos(0);
DspID(0);
// tmp=m_DspState;
m_DspState = _T("执行读FLASH操作");
UpdateData(FALSE);
CRWset dlg;
dlg.flag=1;
dlg.Addrf1=0x1fffff;
if(dlg.DoModal()!=IDOK){DspErrMessage(""); return;}
if(Comm_Test(1))return;
BYTE *x; // DWORD LenX;
DataLen=dlg.Addrf1-dlg.Addrf0+1;
dlg.Addrf0/=2; //字节地址->字地址
// dlg.Addrf1/=2; //字节地址->字地址
// dlg.Addrb0/=2; //字节地址->字地址
x=(BYTE *)&dlg.Addrf0;
FlashAddr=dlg.Addrf0;
BufAddr=dlg.Addrb0;
SBuf[1]=8; //len
SBuf[2]=CMD_READ; //command
SBuf[3]=x[2]; //起始地址
SBuf[4]=x[1];
SBuf[5]=x[0];
x=(BYTE *)&DataLen;
SBuf[6]=x[2]; //长度
SBuf[7]=x[1];
SBuf[8]=x[0];
if(!PrepareComm(CMD_READ))m_DspState = _T("正在执行读FLASH操作...");
else {DspErrMessage("发送指令时出错!"); return;}
Cur_CMD=CMD_READ;
DataLenx=0; Cur_RDataPtr=0; Cur_Ptr=0; RDataLen=0;
// MaxLen=FileLen;
// OnDspFile();
// comm_OK=0;
TmConst=50; //超时定时1.5s: 30*50ms
TmOut=50;
in_x=0;
Cur_progressPtr=0;
m_Progr.SetPos(0);
in_readF=1; B_Stop=1;
B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=B_BufClr=B_BufLocate=0;
B_NextPage=B_LastPage=0;
DspButton();
tmp=m_DspState;
st=time(NULL);
// Dsp_flag=1;
}
void CPrg0::OnErase()
{
Dsp_flag=0;
tmp = _T("请选择操作类型");
m_Progr.SetPos(0);
// tmp=m_DspState;
CEraseSel dlg;
m_DspState = _T("执行FLASH擦除操作");
DspID(0);
UpdateData(FALSE);
if(dlg.DoModal()!=IDOK){m_DspState = _T("请选择操作类型"); UpdateData(FALSE); return;}
char s[100];
BYTE *x;
DWORD addr;
sprintf(s,"%x",dlg.sel);// AfxMessageBox(s);
if(Comm_Test(1))return;
if(!dlg.sel)
{if(!PrepareComm(CMD_CHIP_ERASE))m_DspState = _T("正在执行芯片擦除操作(约15秒)...");
else {DspErrMessage("发送指令时出错!"); return;}
Cur_CMD=CMD_CHIP_ERASE;
DataLen=18000; //用于进度显示:ERASE初始化约需15s
TmConst=50; //超时定时1.5s: 30*50ms
TmOut=50;
}
else
{if(dlg.sel>=1 && dlg.sel<=31)addr=(dlg.sel-1)*0x8000;
else if(dlg.sel==32)addr=0xf8000;
else if(dlg.sel==33)addr=0xfc000;
else if(dlg.sel==34)addr=0xfd000;
else if(dlg.sel==35)addr=0xfe000;
x=(BYTE *)&addr;// sprintf(s,"%x-%x-%x-%x",x[3],x[2],x[1],x[0]);// AfxMessageBox(s);
SBuf[1]=5; //len
SBuf[2]=CMD_SECT_ERASE; //command
SBuf[3]=x[2];
SBuf[4]=x[1];
SBuf[5]=x[0];
if(!PrepareComm(CMD_SECT_ERASE))m_DspState = _T("正在执行扇区擦除操作(约8秒)...");
else {DspErrMessage("发送指令时出错!"); return;}
Cur_CMD=CMD_SECT_ERASE;
DataLen=6000; //ERASE初始化约需8s
TmConst=60; //超时定时1.5s: 30*50ms--
TmOut=60;
}
DataLenx=0;
// comm_OK=0;
in_x=0;
Cur_progressPtr=0;
m_Progr.SetPos(0);
in_erase=1; B_Stop=1;
B_RFlash=B_WFlash=B_EFlash=B_CommTest=0;
DspButton();
tmp=m_DspState;
st=time(NULL);
// Dsp_flag=1;
}
void CPrg0::OnProg()
{
Dsp_flag=0;
if(!wfile_flag){AfxMessageBox("缓冲区没有数据!\n\n请先用打开文件操作装载编程数据。"); return;}
tmp = _T("请选择操作类型");
m_Progr.SetPos(0);
// tmp=m_DspState;
m_DspState = _T("执行 FLASH 编程操作");
DspID(0);
UpdateData(FALSE);
CRWset dlg;
dlg.flag=2;
dlg.Addrf1=FileLen+10;
if(dlg.DoModal()!=IDOK){DspErrMessage(""); return;}
if(Comm_Test(1))return;
BYTE *x; // DWORD LenX;
DataLen=dlg.Addrf1-dlg.Addrf0+1;
dlg.Addrf0/=2; //字节地址->字地址/
// dlg.Addrf1/=2; //字节地址->字地址
// dlg.Addrb0/=2; //字节地址->字地址
x=(BYTE *)&dlg.Addrf0;
FlashAddr=dlg.Addrf0;
BufAddr=dlg.Addrb0;
SBuf[1]=8; //len
SBuf[2]=CMD_PROG; //command
SBuf[3]=x[2]; //起始地址
SBuf[4]=x[1];
SBuf[5]=x[0];
DataLenx=0;
x=(BYTE *)&DataLen;
SBuf[6]=x[2]; //长度
SBuf[7]=x[1];
SBuf[8]=x[0];
if(!PrepareComm(CMD_PROG))m_DspState = _T("正在执行 FLASH 编程操作...");
else {DspErrMessage("发送指令时出错!"); return;}
Cur_CMD=CMD_PROG;
// comm_OK=0;
TmConst=50; //超时定时1.5s: 30*50ms
TmOut=50;
in_x=0;
Cur_progressPtr=0;
m_Progr.SetPos(0);
in_prgF=1; B_Stop=1;
B_FOpen=B_CommTest=B_RFlash=B_WFlash=B_EFlash=B_BufClr=0;
DspButton();
tmp=m_DspState;
st=time(NULL);
// Dsp_flag=1;
}
int CPrg0::InitComm232()// return : 0--正常, 1--错误状态
{
COMSTAT ComStat ;
ComStat.fEof=1;
COMMTIMEOUTS CommTimeOuts ;
BYTE bSet ;// BOOL fconnected;
DCB dcb; // OVERLAPPED OverLapped;
BOOL fRetVal ;
DWORD lpEvtMask=EV_RXCHAR;
HComm232= CreateFile(COMMPORT, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL );
if (!HComm232)return 1;
SetupComm(HComm232, 100000, 4096 ) ;
CommTimeOuts.ReadIntervalTimeout =0; //0xFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier =1; // 2000;
CommTimeOuts.ReadTotalTimeoutConstant =10; //2000;
CommTimeOuts.WriteTotalTimeoutMultiplier =0;//50*CBR_9600/9600;
CommTimeOuts.WriteTotalTimeoutConstant = 0;//11111111;
SetCommTimeouts(HComm232, &CommTimeOuts);
dcb.DCBlength = sizeof( DCB ) ;
GetCommState( HComm232, &dcb ) ;
dcb.BaudRate =BAUDRATE;
dcb.ByteSize =BYTESIZE;
dcb.Parity =2;//MARKPARITY;
dcb.StopBits =STOPBITS;
dcb.fBinary = TRUE ;
dcb.fParity =FPARITY;
dcb.fOutxCtsFlow=FALSE;
dcb.fOutxDsrFlow=FALSE;
dcb.fDtrControl=DTR_CONTROL_DISABLE;
bSet = (BYTE) ((0x04) != 0) ;
dcb.fInX=dcb.fOutX=FALSE;
dcb.XonLim = 100 ;
dcb.XoffLim = 100 ;
fRetVal = SetCommState(HComm232, &dcb ) ;
if (fRetVal)return 0;
else return 1;
}
void CPrg0::OnCancel()
{
if(in_erase || in_prgF || in_readF)
{if(DspHint()!=IDOK){return;}
}
else if(AfxMessageBox("FLASH 编程器程序即将退出!",MB_OKCANCEL)!=IDOK)return;
CloseHandle(HComm232);
free(w);
free(r);
CDialog::OnCancel();
}
BOOL CPrg0::PrepareComm(int CommType)
{
BYTE flag=1;
// int i,j,r;
if(CommType==CMD_OK) //通讯测试
{SBuf[1]=2; //len
SBuf[2]=CMD_OK; //command
}//CMD_CHIP_ERASE,CMD_SECT_ERASE,CMD_PROG,CMD_READ,CMD_RSTFLASH,CMD_CHIP_ID,
else if(CommType==CMD_CHIP_ERASE)//擦除FLASH
{ SBuf[1]=2; //len
SBuf[2]=CMD_CHIP_ERASE; //command
}
else if(CommType==CMD_RSTFLASH)//擦除FLASH
{ SBuf[1]=2; //len
SBuf[2]=CMD_RSTFLASH; //command
}
// else if(CommType==CMD_SECT_ERASE) //扇区擦除
// {SBuf[1]=5; //len
// SBuf[2]=CMD_SECT_ERASE; //command
// SBuf[3]=
// }
return Comm232();
}
int CPrg0::Comm232()
{
// int i,Num,x;
BOOL r;
BYTE Sum;
DWORD Len,Lenx;
// memset(&Lstatex,0,sizeof(LocalState)); //当前状态清零
//TX
if(SBuf[1] && SBuf[1]<=MAXLEN) //SBuff[1]--发的字节数
{Len=SBuf[1]+2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -