📄 ththread.cpp
字号:
// THThread.cpp: implementation of the CTHThread class.
// 芯艺 (c) copyright 2004
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TH.h"
#include "THThread.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTHThread::CTHThread()
{
}
CTHThread::~CTHThread()
{
}
//线程主例程
DWORD CTHThread::ThreadSubProc()
{
CString str;
UCHAR c[3];
UINT Y;
HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,FALSE,"M8BL_EVENT");
ASSERT(hEvent);
if(!m_Port.Open(2))
{
AfxMessageBox("端口2无法打开!",0);
return 1;
}
while(1)
{
WaitForSingleObject(hEvent,INFINITE);
switch(m_Command)
{
case M8BL_SETPAGE://设置页地址索引
break;
case M8BL_WRITE://写FLASH
WriteFlash();
break;
case M8BL_READ://读取FLASH
Y=ReadFlash();
break;
case M8BL_RUN://运行
c[0]=M8BL_RUN;
m_Port.Write(c,1);
break;
default:
break;
}
ResetEvent(hEvent);
m_Port.GetError(str);
if(str.IsEmpty())
m_pParentWnd->SendMessage(MSG_REPORT,m_Command,Y);
}
m_Port.Close();
return 0;
}
//缓冲区内容写入FLASH
void CTHThread::WriteFlash()
{
int i,size;
UCHAR c;
UCHAR *codebuf;
CProgressCtrl *pProgCtrl=(CProgressCtrl *)(m_pParentWnd->GetDlgItem(IDC_PROG));
m_Port.ClearBuffer();//清除串口缓冲区
if(!ScanM8BL())
{
AfxMessageBox("未发现器件");
return ;
}
//计算要写入的页
size=m_CodeSize/M8BL_PAGESIZE;
if((m_CodeSize%M8BL_PAGESIZE)>0)
size++;
size*=M8BL_PAGESIZE;
//分配足够大的内存
codebuf=new UCHAR[size];
if(codebuf==NULL)
{
AfxMessageBox("内存不足");
return ;
}
memset(codebuf,0xff,size);
memcpy(codebuf,m_pBuffer,m_CodeSize);
//复位页地址为0
c=M8BL_SETPAGE;
m_Port.Write(&c,1);
c=0;
m_Port.Write(&c,1);
m_Port.Read(&c,1,10000);
//循环写数据
for(i=0;i<size;i+=M8BL_PAGESIZE)
{
c=M8BL_WRITE;
m_Port.Write(&c,1);
m_Port.Write(codebuf+i,M8BL_PAGESIZE);
if(m_Port.Read(&c,1,10000))
{
AfxMessageBox("通信错误!");
break;
}
else
{
pProgCtrl->SetPos((80*i)/M8BL_FLASHSIZE);
}
}
delete []codebuf;
}
//检测单片机BOOT程序
BOOL CTHThread::ScanM8BL()
{
UCHAR c=M8BL_UARTACK;
m_Port.Write(&c,1);
if(m_Port.Read(&c,1,10000))
return FALSE;
if(c!=M8BL_UARTACK)
return FALSE;
return TRUE;
}
//校验FLASH
BOOL CTHThread::ReadFlash()
{
int i,size;
BOOL Ret=TRUE;
UCHAR c;
UCHAR *pagebuf;
CProgressCtrl *pProgCtrl=(CProgressCtrl *)(m_pParentWnd->GetDlgItem(IDC_PROG));
m_Port.ClearBuffer();//清除串口缓冲区
if(!ScanM8BL())
{
AfxMessageBox("未发现器件");
return FALSE;
}
//计算要读入的页
size=m_CodeSize/M8BL_PAGESIZE;
if((m_CodeSize%M8BL_PAGESIZE)>0)
size++;
size*=M8BL_PAGESIZE;
pagebuf=new UCHAR[M8BL_PAGESIZE];
if(pagebuf==NULL)
{
AfxMessageBox("内存不足");
return FALSE;
}
//复位页地址为0
c=M8BL_SETPAGE;
m_Port.Write(&c,1);
c=0;
m_Port.Write(&c,1);
m_Port.Read(&c,1,10000);
for(i=0;i<size;i+=M8BL_PAGESIZE)
{
c=M8BL_READ;
m_Port.Write(&c,1);
if(m_Port.Read(pagebuf,M8BL_PAGESIZE,10000))
{
Ret=FALSE;
break;
}
for(int j=0;j<M8BL_PAGESIZE;j++)
{
if((i+j)<m_CodeSize)
{
if(pagebuf[j]!=m_pBuffer[i+j])
Ret=FALSE;
}
if(!Ret)
break;
}
pProgCtrl->SetPos((80*i)/M8BL_FLASHSIZE);
if(!Ret)
break;
}
delete []pagebuf;
return Ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -