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

📄 ththread.cpp

📁 《AVR单片机GCC程序设计》
💻 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 + -