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

📄 missionnewdlg.cpp

📁 这个是用串口下载文件到交界处单片机的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    if (sss.Open(m_strFilePath.GetBuffer(100),CFile::modeRead)==0){
		AfxMessageBox("文件不存在,请重新选择文件!");
		return;
	}
	g4InputFileLength = sss.GetLength();
	sss.Read(gInputFileBuffer, g4InputFileLength);
	sss.Close();

	if (gInputFileBuffer[0] == 'A' && gInputFileBuffer[1] == 'V'){
		// AVB文件
		if (gInputFileBuffer[2] == 'B'){
			g2PageFileLength = 0x0800;
			g4InputFileLength = (gInputFileBuffer[0x08] << 8) | gInputFileBuffer[0x09];
			g4TransferFileAddress = (gInputFileBuffer[0x0a] << 8) | gInputFileBuffer[0x0b];
			g4TransferFileLength = g4InputFileLength;
			g4OpenFileAddress = 0;
			g4Local_1 = gInputFileBuffer[0] + gInputFileBuffer[1] + gInputFileBuffer[2] + gInputFileBuffer[3];
			if (!MRFBM_Checksum(0x0008, g4Local_1, MRFBS_Byte2Dword(&gInputFileBuffer[0x04]))){
				return;
			}
		}
		// AVM文件
		else if (gInputFileBuffer[2] == 'M'){
			g2PageFileLength = 0x0800;
			g4InputFileLength = MRFBS_Byte2Dword(&gInputFileBuffer[0x08]);
			g4TransferFileAddress = MRFBS_Byte2Dword(&gInputFileBuffer[0x0c]);
			g4TransferFileLength = g4InputFileLength;
			g4OpenFileAddress = 0;
			g4Local_1 = gInputFileBuffer[0] + gInputFileBuffer[1] + gInputFileBuffer[2] + gInputFileBuffer[3];
			if (!MRFBM_Checksum(0x0008, g4Local_1, MRFBS_Byte2Dword(&gInputFileBuffer[0x04]))){
				return;
			}
		}
		else if (gInputFileBuffer[2] == 'T'){
			g2PageFileLength = 0x0800;
			g4InputFileLength = MRFBS_Byte2Dword(&gInputFileBuffer[0x08]);
			g4TransferFileAddress = 0x00;
			g4TransferFileLength = g4InputFileLength;
			g4OpenFileAddress = 0;
			g4Local_1 = gInputFileBuffer[0] + gInputFileBuffer[1] + gInputFileBuffer[2] + gInputFileBuffer[3];
			g4InputFileLength += 0x40;
			if (!MRFBM_Checksum(0x0008, g4Local_1, MRFBS_Byte2Dword(&gInputFileBuffer[0x04]))){
				return;
			}
			g4InputFileLength = 0;
			do {
				gInputFileBuffer[g4InputFileLength] = gInputFileBuffer[g4InputFileLength+0x40];
			} while (++g4InputFileLength < g4TransferFileLength);
		}
		else {
			AfxMessageBox("不支持的文件,请重新选择文件!");
			return;
		}
		MRFBM_ChangeBank(0);		// 进入暂停模式
		FRFBM_EnableTransferFile = 1;
		progress_ctrl.SetPos(0);	// 复位进度条
	}
	else {
		AfxMessageBox("不支持文件的文件或文件已损坏,请重新选择文件!");
	}
	return;
}
void CDebug51Dlg::MRFBM_WriteFile(){
	BYTE gLocal_1;
	BYTE gLocal_2;
	BYTE gLocal_Buffer[0x42];
	DWORD g4Local_1;
	WORD g2Local_1;
	CByteArray hexdata;

	if (gRFBM_WriteDelayTime == 0){
		if (g2PageFileCounter == 0){
			g2PageFileCounter = 1;
			TCount = g2PageFileLength;

			// 因为这个指令发送太快会令从方接收出错,故增加这个逻辑可以DELAY
			if (gRFBM_WriteStartCommand == 1){
				gRFBM_WriteStartCommand = 0;
				g2PageFileCounter = 0;
				MRFBM_Write_0xf9(0x0000, g4TransferFileAddress, g4TransferFileLength, g2PageFileLength);
			
			}

			g4Local_1 = g4TransferFileLength / 100; 
			g2TransferFilePercent = (WORD) g4Local_1; 
			g4Local_1 = g4TransferFileLength / g2PageFileLength;
			g2PageFileEndCounter = (WORD) g4Local_1;
			g4TransferFileChecksum = 0;
			OnSaveIt();
		}
		else if (g2PageFileCounter < 0xffff){
			++g2PageFileCounter;

			if ((g4OpenFileAddress & 0x0fff) == 0x000){
				gRFBM_FlashBlock = 0;
				g4Local_1 = g4OpenFileAddress;
				g2Local_1 = 0;
				do {
					if (gUpdataFileBuffer[g4Local_1] != gInputFileBuffer[g4Local_1]){
						gUpdataFileBuffer[g4Local_1] = gInputFileBuffer[g4Local_1];
						gRFBM_FlashBlock = 0x01;
					}
					++g4Local_1;
				} while (++g2Local_1 < 0x1000);
			}
gRFBM_FlashBlock = 0x01;
			g4PageFileChecksum = 0;
			g2Local_1 = 0;
			do {
				// 发送0x20组数据,每组0x40个字节
				gLocal_Buffer[0] = 0x42;
				gLocal_Buffer[1] = 0xf8;
				gLocal_1 = 0;
				do {
					gLocal_2 = gInputFileBuffer[g4OpenFileAddress++];
					gLocal_Buffer[gLocal_1 + 2] = gLocal_2;
					g4PageFileChecksum += gLocal_2;
					g4TransferFileChecksum += gLocal_2;
				} while (++gLocal_1 < 64);
				if (gRFBM_FlashBlock == 0x01){
					MRFBM_WriteCommand(gLocal_Buffer);
				}
				g2Local_1 += 0x40;
			} while (g2Local_1 < g2PageFileLength);	
			g4TransferFileAddress += g2PageFileLength;

			if (gRFBM_FlashBlock == 0x01){
				// 处理0xf9指令
				if (g2PageFileCounter <= g2PageFileEndCounter){
					MRFBM_Write_0xf9(g2PageFileCounter, g4TransferFileAddress, g4PageFileChecksum, 0x0000);
					// 如果 > 0x4000则每隔 0x2000 增加DELAY
					if ((g2PageFileCounter > 0x08) && ((g2PageFileCounter & 0x03) == 0x00)){
						gLocal_1 = 0;
						do {
							MDELAY(64);	// DELAY
						} while (++gLocal_1 < 32);
					}
				}
			}
			// 如果是最后包,处理0xf9指令
			if (g2PageFileCounter > g2PageFileEndCounter){
				 MRFBM_Write_0xf9(0xffff, g4TransferFileChecksum, g4PageFileChecksum, 0x0000);
				g2PageFileCounter = 0xffff;
			}

			// 处理进度条
			g4Local_1 = g2PageFileCounter;
			g4Local_1 = g4Local_1 * g2PageFileLength;
			g4Local_1 = g4Local_1 / g2TransferFilePercent;
			if (g4Local_1 > 100) g4Local_1 = 100;
			progress_ctrl.SetPos(g4Local_1);
			TCount += g2PageFileLength;
		}
		else {
			g2PageFileCounter = 0;
			FRFBM_TransferFile = 0;
			progress_ctrl.SetPos(100);
			MRFBM_ChangeBank(1);		// 进入运行模式
			FDSPHardwareBank = 0;
		}
	}
	return;
}
void CDebug51Dlg::OnComm(){										// 用于接收串口发来的数据, 
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	long g4Local_1;
	long g4Local_2;

	if (m_com.GetCommEvent() == 2){ 
		variant_inp = m_com.GetInput(); 
		safearray_inp = variant_inp; 
		g4Local_1 = safearray_inp.GetOneDimSize(); 
		g4Local_2 = 0;
		do {										// 收到串口数据,只是保存在gRFBM_RX_FIFO之中,让OnTimer处理
			safearray_inp.GetElement(&g4Local_2, gRFBM_RX_FIFO + g2RFBM_RX_InFIFO);
			if (++g2RFBM_RX_InFIFO > cRFBM_RX_FIFO) g2RFBM_RX_InFIFO = 0;
		} while (++g4Local_2 < g4Local_1);
	}
	return;
}
BOOL CDebug51Dlg::MRFBM_RX_Buffer(){
	BYTE gLocal_1;
	if (g2RFBM_RX_InFIFO != g2RFBM_RX_OutFIFO){										// FIFO不是空的,表示收到串口数据
		while (1) {
			gLocal_1 = gRFBM_RX_FIFO[g2RFBM_RX_OutFIFO];							// 从接收FIFO中取数
			if (++g2RFBM_RX_OutFIFO > cRFBM_RX_FIFO) g2RFBM_RX_OutFIFO = 0;
			
//MDEBUG(gLocal_1);
//MDEBUG(gRFBM_Counter);
			if (++gRFBM_Counter < 8){
				if (gRFBM_Counter < 4){
					 if (gLocal_1 != 0xe0) gRFBM_Counter = 0;						// 不为'0',重置计数器 
				}
				else if (gRFBM_Counter < 6){
					if (gLocal_1 != 0xfc) gRFBM_Counter = 0;						// 不为'1',重置计数器 				
					gRFBM_Command = 0;
				}
				else if (gRFBM_Counter == 6){
					if (gLocal_1 == 0xfc) gRFBM_Command = 0x01;						// 指令包类型选择0
				}
				else if (gRFBM_Counter == 7){
					if (gLocal_1 == 0xfc) gRFBM_Command |= 0x02;					// 指令包类型选择1
				}
			}
			else {
				if (MRFB_ReadCommand(gLocal_1)){
					FRFBM_SlaveNotFound = 0;
					return 1;
				}
			}
			if (gRFBM_Counter > 64){												// 防止异常出错
				gRFBM_Counter = 0;
			}
			if (g2RFBM_RX_InFIFO == g2RFBM_RX_OutFIFO) break;						// FIFO已经清空则退出
		};
	}	
	return 0;
}
BOOL CDebug51Dlg::MRFB_ReadCommand(BYTE gLocal_1){		// 处理接收到的指令
	BYTE gLocal_Bit;
	gLocal_Bit = 2;
	if (gLocal_1 == 0xe0){
		gLocal_Bit = 0;
	}
	if (gLocal_1 == 0xfc){
		gLocal_Bit = 1;
	}	
	switch (gRFBM_Command){
		case 0x00 : 
			gRFBM_Counter = 0;
			break;
		case 0x01 : 
			gRFBM_Counter = 0;
			break;
		case 0x02 : 
			if (gRFBM_Counter == 8){
				FRFBM_RX_PauseMode = 0;					// 运行模式
				if (gLocal_Bit == 1){
					FRFBM_RX_PauseMode = 1;				// 暂停模式
				}
			}
			else{
				if (!FRFBM_RX_PauseMode){				// 运行模式的显示
					gRFBM_Debug >>= 1;
					if (gLocal_Bit == 1){
						gRFBM_Debug |= 0x80;
					}
					if (gRFBM_Counter == 16){
						MRFBM_Display();
						FDSPHardwareBank = 1;			// 收到运行模式的显示表示所运行的已经是运行模式
						break;
					}
				}
				else {									// 暂停模式的显示			
					gRFBM_Debug = gLocal_1;
					MRFBM_Display();
					break;
				}
			}
			return 0;
		case 0x03 :
			gRFBM_ChangeModeCommand = 0x80;
			if (gLocal_Bit == 1){
				gRFBM_ChangeModeCommand = 0x81;
			}
			gRFBM_Counter = 0;
			break;
		default : gRFBM_Counter = 0; break;
	}
	return 1;
}

void CDebug51Dlg::MRFBM_Display(){
	gRFBM_Counter = 0;
	MDEBUG(gRFBM_Debug);   // 显示接受数据
	gRFBM_ReceiveBuffer[g2RFBM_ReceiveCount] = gRFBM_Debug;
	return;
}
BOOL CDebug51Dlg::MRFBM_Checksum(DWORD g4Local_1, DWORD g4Local_Checksum, DWORD g4Local_2){
	do {
		g4Local_Checksum += gInputFileBuffer[g4Local_1];
	} while (++g4Local_1 < g4InputFileLength);
	if (g4Local_Checksum != g4Local_2){
		AfxMessageBox("文件已损坏,请重新选择文件!");
		MDEBUG(0x44);
		MDEBUG((BYTE)(g4Local_Checksum>>24));
		MDEBUG((BYTE)(g4Local_Checksum>>16));
		MDEBUG((BYTE)(g4Local_Checksum>>8));
		MDEBUG((BYTE)(g4Local_Checksum));
		MDEBUG((BYTE)(g4Local_2>>24));
		MDEBUG((BYTE)(g4Local_2>>16));
		MDEBUG((BYTE)(g4Local_2>>8));
		MDEBUG((BYTE)g4Local_2);
		return 0;
	}
	return 1;
}

void CDebug51Dlg::MRFBM_Write_0xf9(WORD g2Local_1, DWORD g4Local_1, DWORD g4Local_2, WORD g2Local_2){
	BYTE gLocal_Buffer[72];
	
	gLocal_Buffer[0] = 0x0e;
	gLocal_Buffer[1] = 0xf9;
	gLocal_Buffer[2] = (g2Local_1 >> 8) & 0xff;		// 字节6
	gLocal_Buffer[3] = g2Local_1 & 0xff;			// 字节7

	gLocal_Buffer[4] = (BYTE)(g4Local_1 >> 24) & 0xff;
	gLocal_Buffer[5] = (BYTE)(g4Local_1 >> 16) & 0xff;
	gLocal_Buffer[6] = (BYTE)(g4Local_1 >> 8) & 0xff;
	gLocal_Buffer[7] = (BYTE)(g4Local_1 & 0xff);

	gLocal_Buffer[8] = (BYTE)(g4Local_2 >> 24) & 0xff;
	gLocal_Buffer[9] = (BYTE)(g4Local_2 >> 16) & 0xff;
	gLocal_Buffer[10] = (BYTE)(g4Local_2 >> 8) & 0xff;
	gLocal_Buffer[11] = (BYTE)(g4Local_2 & 0xff);

	gLocal_Buffer[12] = (BYTE)(g2Local_2 >> 8) & 0xff;
	gLocal_Buffer[13] = (BYTE)(g2Local_2 & 0xff);
	MRFBM_WriteCommand(gLocal_Buffer);
	return;
}
DWORD CDebug51Dlg::MRFBS_Byte2Dword(BYTE *gpLocal_1){
    DWORD g4Local_1;
    g4Local_1 = *gpLocal_1++;
    g4Local_1 = (g4Local_1 << 8) | *gpLocal_1++;
    g4Local_1 = (g4Local_1 << 8) | *gpLocal_1++;
    g4Local_1 = (g4Local_1 << 8) | *gpLocal_1;
    return g4Local_1;
}

void CDebug51Dlg::MRFBM_WriteCommand(BYTE *gpLocal_1){
	BYTE gLocal_1;
	BYTE gLocal_2;
	BYTE gLocal_Checksum;
	CByteArray hexdata;

	// 0001 110x xxxx ....
	hexdata.Add(0x80);
	hexdata.Add(0x80);
	hexdata.Add(0x80);
	hexdata.Add(0xfe);
	hexdata.Add(0xfe);
	hexdata.Add(0xfe);
	hexdata.Add(0x80);

	gLocal_Checksum = 0;
	gLocal_2 = 0;
	gLocal_1 = *gpLocal_1;
	do {
		gLocal_2 = *gpLocal_1++;
		hexdata.Add(gLocal_2);
		gLocal_Checksum += gLocal_2;
	} while (--gLocal_1 != 0);
	hexdata.Add(gLocal_Checksum);

	m_com.SetOutput(COleVariant(hexdata));
	this->UpdateData(false);
	hexdata.RemoveAll();
	return;
}
void CDebug51Dlg::MDELAY(WORD g2Local_1){
	CByteArray hexdata;
	do {
		hexdata.Add(0xfe);
	} while (--g2Local_1 != 0);
	m_com.SetOutput(COleVariant(hexdata));
	this->UpdateData(false);
	hexdata.RemoveAll();
	return;
}
void CDebug51Dlg::MRFBM_RoutineCommand(){
	CByteArray hexdata;
	// 0001 100
	hexdata.Add(0x80);
	hexdata.Add(0x80);
	hexdata.Add(0x80);
	hexdata.Add(0xfe);

	hexdata.Add(0xfe);
	hexdata.Add(0x80);
	hexdata.Add(0x80);
	hexdata.Add(0xfe);
	m_com.SetOutput(COleVariant(hexdata));
	this->UpdateData(false);
	hexdata.RemoveAll();
	return;
}
void CDebug51Dlg::MRFBM_ChangeBank(BOOL FLocal_1){
	CByteArray hexdata;
	// 0001 111x
	hexdata.Add(0x80);
	hexdata.Add(0x80);
	hexdata.Add(0x80);
	hexdata.Add(0xfe);
	hexdata.Add(0xfe);
	hexdata.Add(0xfe);
	hexdata.Add(0xfe);
	if (FLocal_1){
		hexdata.Add(0xfe);
	}
	else {
		hexdata.Add(0x80);
	}
	m_com.SetOutput(COleVariant(hexdata));
	this->UpdateData(false);
	hexdata.RemoveAll();
	gRFBM_Change_Timer = 199;
	FRFBM_ChangeBank = 1;
	return;
}

void CDebug51Dlg::MDEBUG(BYTE gLocal_1){		// 用作调试
	BYTE gLocal_2[4];
	gLocal_2[0] = MHEX2ASC(gLocal_1 >> 4);
	gLocal_2[1] = MHEX2ASC(gLocal_1);
	gLocal_2[2] = ' ';
	gLocal_2[3] = 0x00;
	
	if (++g2RFBM_ReceiveCount > cRFBM_ReceiveBuffer){
		OnSaveIt();
	}
	m_Receive += (CString)gLocal_2;
   this->UpdateData(false);

//	m_EditCtrl.LineScroll(m_EditCtrl.GetLineCount(),0);
	return;
}
BYTE CDebug51Dlg::MHEX2ASC(BYTE gLocal_1){
	gLocal_1 &= 0x0f;
	if (gLocal_1 < 10) return gLocal_1 + '0';
	return (gLocal_1 - 10) + 'A';
}

⌨️ 快捷键说明

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