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

📄 filetransferdlg.cpp

📁 串口开发的另一种方式.rar
💻 CPP
字号:
// FileTransferDlg.cpp : implementation file
//

#include "stdafx.h"
#include <process.h>
#include "TestSerialPort2.h"
#include "FileTransferDlg.h"
#include "superSP.h"

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


//////////////////////////////////////////////////////////////////////////
// 从磁盘装载文件线程

ULONG WINAPI SendThread(LPVOID lpvoid)
{	
	CFileTransferDlg* pDlg = (CFileTransferDlg *)lpvoid;

	
	UINT   readedByte = 0;
	UINT   wantByte   = 1024;
	DWORD  dwleftByte;
	DWORD  dwTotalByte = pDlg->file.GetLength();
	dwleftByte = dwTotalByte;
	
	Sleep(100);

	LONG thrStatus;
	BOOL bExit = false;
	while (!bExit)
	{
	    thrStatus = WaitForMultipleObjects(2, 
			pDlg->hEvent,
			false,
			INFINITE);
		thrStatus -= WAIT_OBJECT_0;

		switch(thrStatus)
		{
		case 0:
		    bExit = true;
			break;

		case 1:
			{
				// 分块读取文件内容,并发送
				PACKAGE pack;
				if (dwleftByte < 1024)
				{
					wantByte = dwleftByte;
				}
				readedByte = pDlg->file.Read(pack.pData, wantByte);
				pack.iLen  = readedByte;
				pack.iType = CSuperSerialPort::emDATA_TYPE_BINARY;
				
				pDlg->pSSP->SendData(&pack);
				dwleftByte -= readedByte;
			    pDlg->PostMessage(WM_UM_SEND_EVENT, (WPARAM)dwleftByte);
				
				// 是否读取到文件尾了
				if (dwleftByte <= 0 )
				{
					bExit = true;
				}
				else
				{
					try
					{
						pDlg->file.Seek(dwTotalByte - dwleftByte, CFile::begin);
					}
					catch (CFileException e)
					{
						bExit = true;
					}
				}
			}
			break;
			
		default:
			break;
		}
	}

	pDlg->file.Close();
	pDlg->m_isClose = true;
	return 0;
}

/////////////////////////////////////////////////////////////////////////////
// CFileTransferDlg dialog


CFileTransferDlg::CFileTransferDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFileTransferDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFileTransferDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CFileTransferDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFileTransferDlg)
	DDX_Control(pDX, IDC_PROGRESS_TRANSFER, m_transferProg);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFileTransferDlg, CDialog)
	//{{AFX_MSG_MAP(CFileTransferDlg)
	ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
	ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BUTTON_RECEIVE, OnButtonReceive)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_UM_SEND_EVENT, OnDoSendEvent)
	ON_MESSAGE(WM_UM_RECEIVE_EVENT, OnDoReceiveEvent)
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////
//  自定义消息处理

void CFileTransferDlg::OnDoSendEvent(WPARAM wParam, LPARAM lParam)
{
	m_lCurLeftByte = (long)wParam;
	CString str;
	str.Format("%d", m_dwFileSize - m_lCurLeftByte);
	SetDlgItemText(IDC_EDIT_TRANSFERED_BYTE, str);
	
	if (m_lCurLeftByte == 0)
	{
		AfxMessageBox("文件传输完毕");
	}
}


void CFileTransferDlg::OnDoReceiveEvent(WPARAM wParam, LPARAM lParam)
{
	pPACKAGE pPack = (pPACKAGE)wParam;
	ASSERT(pPack);
	ASSERT(pPack->pData);
	
	if (m_bIsFirstPackage)
	{
		if (pPack->pData[0] == '$') // 接收到一个$开始
		{
			m_dwFileSize = atol((char *)pPack->pData+1);
			m_bIsFirstPackage = FALSE;
			
			CString fileSize;
			fileSize.Format("%.2f", m_dwFileSize/1024.0f);
			SetDlgItemText(IDC_EDIT_TRANSFER_BYTE, fileSize);
			
			m_lCurLeftByte = m_dwFileSize;
			m_lPreLeftByte = m_dwFileSize;
		}

	}
	else
	{
		file.Write(pPack->pData, pPack->iLen);

		m_lCurReceiveByte += pPack->iLen;
		m_lCurLeftByte = m_dwFileSize - m_lCurReceiveByte;


		CString str;
		str.Format("%d", m_lCurReceiveByte);
		SetDlgItemText(IDC_EDIT_TRANSFERED_BYTE, str);

		if (m_lCurReceiveByte >= m_dwFileSize)
		{
			file.Flush();
			file.Close();
			AfxMessageBox("文件接收完毕");
			m_bIsFirstPackage = TRUE;
		}
	}

	delete pPack;
}

/////////////////////////////////////////////////////////////////////////////
// CFileTransferDlg message handlers

void CFileTransferDlg::OnButtonBrowse() 
{
	if (m_fileCtrl.OpenFileDialog())
	{
		SetDlgItemText(IDC_EDIT_FILE_PATH, 
			m_fileCtrl.GetSelectedDir());
	}
	else
	{
		AfxMessageBox("文件打开失败,检查文件是否被选中");
	}
}

BOOL CFileTransferDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
    if (pSSP == NULL)
	{
		AfxMessageBox("串口没被赋予该窗口");
		return FALSE;
    }

	m_transferProg.SetRange(1, 100);
	m_transferProg.SetStep(1);


	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false);
	if (IsReceiveDlg)
	{
	    GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow();
	}
	else
	{
        GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BUTTON_SEND)->EnableWindow();
	}
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CFileTransferDlg::OnButtonSend() 
{
	CString fileName ;
	GetDlgItemText(IDC_EDIT_FILE_PATH, fileName);
	if (fileName.IsEmpty()) 
	{
		AfxMessageBox("没有选择要传输的文件");
		return;
	}


	CFileException e;
	if (!file.Open(fileName,
		CFile::modeRead, &e))
	{
		AfxMessageBox("文件打开失败");
		return;
	}

	DWORD  dwfSize;
	dwfSize = file.GetLength();
	CString fileSize;
	fileSize.Format("%.2f", dwfSize/1024.0f);
	SetDlgItemText(IDC_EDIT_TRANSFER_BYTE, fileSize);
	
	m_dwFileSize   = dwfSize;
	m_lCurLeftByte = m_dwFileSize;
	m_lPreLeftByte = m_dwFileSize;
		
	
	hEvent[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
	hEvent[1] = CreateEvent(NULL, TRUE, TRUE, NULL);
	

	//  先发送一个要传输文件的长度
	PACKAGE pk;
	CString strLen;
	strLen.Format("$%d", m_dwFileSize);
	strcpy((char *)pk.pData, strLen);
	pk.iLen = strLen.GetLength();
	pSSP->SendData(&pk);
	

    SetTimer(1, 1000, NULL);


	DWORD thrId;
	hLoadThread = CreateThread(NULL,
		   0,
		   SendThread,
		   this,
		   0,
		   &thrId);
    SetThreadPriority(hLoadThread,
		THREAD_PRIORITY_BELOW_NORMAL);


	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow();
}

void CFileTransferDlg::OnTimer(UINT nIDEvent) 
{
	switch(nIDEvent)
	{
	case 1:
		{
			// 每秒传输速度
			INT  preByte = m_lPreLeftByte - m_lCurLeftByte  ;
			CString transRate;
			transRate.Format(_T("%.2f"), preByte/1024.0f);
			SetDlgItemText(IDC_EDIT_TRANSFER_SPEED, transRate);
			m_lPreLeftByte = m_lCurLeftByte;

			// 传输进度
			if (m_dwFileSize != 0)
			{
				int precent = (m_dwFileSize - m_lCurLeftByte)*100/m_dwFileSize;
				m_transferProg.SetPos(precent);
			}

			// 剩余时间
			if (preByte != 0)
			{
				int leftTime = m_lCurLeftByte/preByte;
				SetDlgItemInt(IDC_EDIT_LEFT_TIME, leftTime);
			}
			else
			{
				SetDlgItemInt(IDC_EDIT_LEFT_TIME, 0);				
			}
			
		}
		break;

	default:
		break;
	}
	CDialog::OnTimer(nIDEvent);
}

void CFileTransferDlg::OnButtonStop() 
{
    SetEvent(hEvent[0]);
	ResetEvent(hEvent[1]);
    GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
	
	if (IsReceiveDlg)
	{
	    GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow();
	}
	else
	{
	    GetDlgItem(IDC_BUTTON_SEND)->EnableWindow();
	}
}

void CFileTransferDlg::OnClose() 
{
	CloseHandle(hEvent[0]);
	CloseHandle(hEvent[1]);
	pSSP->CloseFileTransfer(); // 关闭文件接收
	CDialog::OnClose();
}

void CFileTransferDlg::OnButtonReceive() 
{
	CString fileName ;
	GetDlgItemText(IDC_EDIT_FILE_PATH, fileName);

	if (!fileName.IsEmpty())
	{
		// 先删除原来的文件
		DeleteFile(fileName);
		
		if (file.Open(fileName,
			CFile::modeCreate | CFile::modeWrite))
		{
			pSSP->OpenFileTransfer(this, WM_UM_RECEIVE_EVENT);
			m_lCurReceiveByte = 0;
			m_bIsFirstPackage = TRUE;

			
			GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow(FALSE);
			GetDlgItem(IDC_BUTTON_STOP)->EnableWindow();
			SetTimer(1, 1000, NULL);
		}
		else
		{
			AfxMessageBox("文件创建失败");
		}
	}
	else
	{
		AfxMessageBox("输入你要保存的文件类型和目录");
	}
}

⌨️ 快捷键说明

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