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

📄 ccd_commcenter.c

📁 串口传输文件device端实例
💻 C
📖 第 1 页 / 共 3 页
字号:
				if(FILE_PATHLEN == commVar.fStep) { 
					if(readcount < sizeof(UInt32)) {
							//包体尚未接收到最小数据长度
							continue;
					}

					//计算包体的CRC16
					commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, sizeof(UInt32));

					//读取路径长度
					commVar.fcb.PathLen = CommCenter_ntohl( CommCenter_strtol(commVar.szStoreBuffer + commVar.nPotS) );
					if(commVar.fcb.PathLen <= 0 || commVar.fcb.PathLen >= MAXPATH_LEN) {//文件路径长度字段错误
							//文件错误报告, 处理
							CommCenter_ErrorDealEvent(&commVar, 0x00000006, 0x00000006);
							continue;
					}
#ifdef debug_modul
					sprintf((char *)szOutPutBuff, (char *)"==== COM4: %d %d %d\n", commVar.fcb.PathLen, commVar.nPotS, commVar.nPotE);
					EOS_Write(commVar.deBugfp, szOutPutBuff, StrLen(szOutPutBuff));
#endif
						
					//更新其它数据
					commVar.fStep = FILE_PATH;
					commVar.nPotS+= sizeof(UInt32);
					readcount -= sizeof(UInt32);

					//继续处理缓冲区
				} //end 取文件路径长度

				//3. 取文件路径
				if(FILE_PATH == commVar.fStep) { 
					if(readcount < commVar.fcb.PathLen) {
							//包体尚未接收到完整文件路径信息
							continue;
					}

					//计算包体的CRC16
					commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, commVar.fcb.PathLen);
							
					//更新文件路径
					StrNCopy(commVar.fcb.Path, commVar.szStoreBuffer + commVar.nPotS, commVar.fcb.PathLen);
#ifdef debug_modul
					sprintf((char *)szOutPutBuff, (char *)"==== PATH: %s %d %d\n", commVar.fcb.Path, commVar.nPotS, commVar.nPotE);
					EOS_Write(commVar.deBugfp, szOutPutBuff, StrLen(szOutPutBuff));
#endif

					//创建可能的目标目录(假定前3个是盘符, 如C:\)
					MdWithFile(commVar.fcb.Path, commVar.fcb.Path + StrLen((Char *)"C:\\"));

					//打开或创建目标文件
					if(0 <=commVar.hFile) EOS_Close(commVar.hFile);
					commVar.hFile = EOS_Open(commVar.fcb.Path, PO_CREAT|PO_TRUNC|PO_BINARY|PO_WRONLY, PS_IWRITE);
					if(0 > commVar.hFile) {
							//打开或创建目标文件失败
							CommCenter_ErrorDealEvent(&commVar, 0x00000005, 0x00000007);
							continue;
					}

					//更新其它数据
					commVar.fStep = FILE_LENTH;
					commVar.nPotS+= commVar.fcb.PathLen;
					readcount -= commVar.fcb.PathLen;

					//继续处理缓冲区
				} //end 取文件路径

				//4. 取文件长度
				if(FILE_LENTH == commVar.fStep) { 
					if(readcount < sizeof(UInt32)) {
							//包体尚未接收到完整文件路径信息
							continue;
					}

					//计算至文件内容的CRC16
					commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, sizeof(UInt32));

					//更新文件长度
					commVar.fcb.len = CommCenter_ntohl( CommCenter_strtol(commVar.szStoreBuffer + commVar.nPotS) );
					if(0 >= commVar.fcb.len) {//文件长度字段错误
							//文件错误报告,处理
							CommCenter_ErrorDealEvent(&commVar, 0x00000006, 0x00000008);
							continue;
					}							
#ifdef debug_modul
					sprintf((char *)szOutPutBuff, (char *)"==== COM6: %d %d %d\n", commVar.fcb.len, commVar.nPotS, commVar.nPotE);
					EOS_Write(commVar.deBugfp, szOutPutBuff, StrLen(szOutPutBuff));
#endif

					//更新相关数据
					commVar.fStep = FILE_DATA;
					commVar.nPotS+= sizeof(UInt32);
					commVar.fcb.WriteLen = 0;
					readcount -= sizeof(UInt32);

					//继续处理缓冲区
				} //end 取文件长度

				//5. 取文件数据
				if(CommCenter_FILEDATA == commVar.nStep) { 
					if(readcount <= 0) {
							//包体尚未接收到最小数据长度
							continue;
					}
						
					if(commVar.fcb.WriteLen < commVar.fcb.len) {
							tmpWcount = min(readcount, commVar.fcb.len - commVar.fcb.WriteLen);

							//计算当前所读数据的CRC16
							commVar.pcb->cCRC = Add_CRC16(commVar.pcb->cCRC, commVar.szStoreBuffer+commVar.nPotS, tmpWcount);
								
							if(tmpWcount != EOS_Write(commVar.hFile, commVar.szStoreBuffer+commVar.nPotS, tmpWcount)) {
								//文件写入失败
								CommCenter_ErrorDealEvent(&commVar, 0x00000006, 0x00000009);
								continue;
							}

							readcount -= tmpWcount;
							commVar.fcb.WriteLen += tmpWcount;	//保存当前所读数据到文件

							//向父进程发送消息,要求显示“文件下载进度”
							CommCenterThread_Inform(AppRequest_GetFatherPid(), WinGetWindowHwndId(g__winP), CommCenter_FILEDATA, commVar.fcb.nId, commVar.fcb.WriteLen, commVar.fcb.len);

							//汇报已经正确接收并处理完报文
							CommCenter_ErrorDealEvent(&commVar, 0x00000000, sizeof(CommCenter_PACKETHEADType)+sizeof(UInt32)+sizeof(UInt32)+commVar.fcb.PathLen+sizeof(UInt32)+commVar.fcb.WriteLen);
					}

					//在此, 可以认为已经处理完所读的数据, 更新相关数据
					commVar.nPotS = sizeof(CommCenter_PACKETHEADType);
					commVar.nPotE = sizeof(CommCenter_PACKETHEADType);
							
					if(commVar.fcb.WriteLen >= commVar.fcb.len) { //写完一个文件
							if(0 <= commVar.hFile) {
								EOS_Close(commVar.hFile); 
								commVar.hFile = -1;
							}
								
							//校验报文的CRC16
							if(FALSE == IsValid_CRC16(commVar.pcb->cCRC, commVar.CRC) ) {
								//文件传输出错
								CommCenter_ErrorDealEvent(&commVar, 0x00000003, 0x0000000A);
								continue;
							}
								
							//汇报已经正确写入文件
							CommCenter_ErrorDealEvent(&commVar, 0x00000000, sizeof(CommCenter_PACKETHEADType)+sizeof(UInt32)+sizeof(UInt32)+commVar.fcb.PathLen+sizeof(UInt32)+commVar.fcb.WriteLen);

							//更新数据
							commVar.nStat = CommCenter_PACKETHEAD;
							commVar.fStep = FILE_INDEX;
							commVar.nPotS = 0;
							commVar.nPotE = 0;

							if(commVar.fcb.nId >= commVar.FiletotleCount) {
								MemSet(&commVar.fcb, 0, sizeof(CommCenter_FILEINDEXType));
								commVar.nStep = CommCenter_FILEWAIT;
								commVar.FiletotleCount = 0;

								//向父进程发送消息,要求显示“文件传输完毕,进入文件传输等待状态”
								CommCenterThread_Inform(AppRequest_GetFatherPid(), WinGetWindowHwndId(g__winP), CommCenter_FILEWAIT, 0, 0, 0);
							}
					} //end if(commVar.fcb.WriteLen >= commVar.fcb.len)
						
				} //end 取文件数据
					
			} //end 发送文件

		} //end 接收报体
	} // end while(FALSE == bExitThread)
	
	if(0 <= commVar.comId) {
		Close(commVar.comId);
		commVar.comId = -1;			
	}
	
	if(0 <= commVar.hFile) {
		EOS_Close(commVar.hFile);
		commVar.hFile = -1;
	}
	
#ifdef debug_modul
	if(0 <= commVar.deBugfp) {
		EOS_Write(commVar.deBugfp, (Char *)"thread end!\n", StrLen((Char *)"thread end!\n"));
		EOS_Close(commVar.deBugfp);
	}
#endif
	return TRUE;
}


////////////////////////////////////////
//  串口下载窗体处理函数

Boolean CommCenterAppFrmProgressHandleEvent(void *globalVarPtr, WinHandle formP, EventPtr eventP)
{
    //CommCenter_DEMOGVRType		*pVar = (CommCenter_DEMOGVRType *)globalVarPtr;
    Boolean					 handled = FALSE;
	Char					 szTxt[512];	
	LabelType				*pLab_BarHint  = WinGetControlPtr(formP, Com_ID_FrmProgress_BarHint_FrmProgress);	
	RectangleType			 rtCtl;
	Int32 r;

	switch(eventP->eType) {
	case winInitEvent:

		//启动IO线程
		g__winP = formP;

		r = AppRequest_MethodExec((Char *)"Comm_IOType", (Char *)APP_NAME_CDD_COMMCENTER, (Char *)"Comm_IO", NULL, 0);
		
		handled = TRUE;
		break;
		
	case winPaintEvent:
		WinDrawWindow(formP);
		handled = TRUE;
		break;

	case RSPCOM_MSG:
		
		switch(eventP->sParam1){	
		case CommCenter_FILEWAIT://等待文件传输
			sprintf((char *)szTxt, (char *)"正在等待文件传输...");
			break;

		case CommCenter_FILEREQ://传输文件请求
			sprintf((char *)szTxt, (char *)"开始传输文件,共%d个", eventP->lParam3);
			break;

		case CommCenter_FILEDATA://传输文件内容
			sprintf((char *)szTxt, (char *)"目前传输: %d字节", eventP->lParam3);
			break;
		
		default: break;	
		}
		
		//更新文件下载进度说明
		if(0 != StrLen(szTxt)) WinSetControlCaption(formP, Com_ID_FrmProgress_TxtHint_FrmProgress, szTxt, FALSE);
		
		if(CommCenter_FILEDATA == eventP->sParam1) {
			//更新文件下载进度条
			CtlGetBounds(pLab_BarHint, &rtCtl);
			rtCtl.extent.X = (Int16)(162*eventP->lParam3/eventP->lParam4);
			CtlSetBounds(pLab_BarHint, &rtCtl);
			WinDrawControl(formP, Com_ID_FrmProgress_BarHint_FrmProgress);
			
			if(eventP->lParam3 == eventP->lParam4) {
				CtlGetBounds(pLab_BarHint, &rtCtl);
				rtCtl.extent.X = 0;
				CtlSetBounds(pLab_BarHint, &rtCtl);
				WinDrawControl(formP, Com_ID_FrmProgress_Field1114);
			}
		}
				
		handled = TRUE;
		break;
		
	case ctlSelectEvent:
		if(Com_ID_FrmProgress_Close_FrmProgress == eventP->sParam1) {
			g__winP = NULL;
			WinCloseWindow(formP);
			AppSendStopEvent();
			handled = TRUE;
		}
		break;
	}
	
	return handled;
}

//////////////////////////////////////////////////////////////////////////
// 串口下载窗体处理函数
//
Boolean App_CCD_CommCenterAppHandleEvent(void *globalVarPtr, EventPtr eventP)
{
    //CommCenter_DEMOGVRType * pVar = (CommCenter_DEMOGVRType *)globalVarPtr;
    WinHandle formP;
    Boolean handled = FALSE;
    
    if (eventP->eType == frmOpenEvent)
	{
        formP = WinGetWindowPtrByResId(eventP->sParam1);
        WinSetActiveWindow(formP);
        switch (eventP->sParam1)
		{
		case Com_ID_FrmProgress:
			WinSetEventHandlerEx (formP, CommCenterAppFrmProgressHandleEvent);
			break;
		
		default:   break;
        }
        handled = TRUE;
    }
    return handled;
}

//////////////////////////////////////////////////////////////////////////
// 串口下载应用入口
//
void CCD_CommCenterAppMain(UInt32 cmd, void *cmdPBP)
{
    CommCenter_DEMOGVRType *pVar;
	Int32 r;

    switch(cmd)
    {
    case SYSTEM_START_REGISTER: // 终端操作系统启动时进入
    case SYSTEM_RESTART_REGISTER:  //终端操作系统重新启动时进入		
		r = AppRegister_DataTypeAdd((Char *)"Comm_IOType", NULL);
		r = AppRegister_MethodAdd((Char *)"Comm_IOType", (Char *)"Comm_IO", 2, METHOD_THREAD);		
		break;

	case 2:			
		CommCenter_IOThread(); //线程处理过程
		break;

	case 0: // 在终端操作界面点击图标时进入
        //应用进行本功能的初始化工作
		pVar = mcMalloc(sizeof(CommCenter_DEMOGVRType));
		MemSet(pVar, 0, sizeof(CommCenter_DEMOGVRType));

		//初始化并注册GUI应用,设置应用消息处理函数和主窗口ID
        WM_GuiAppInit(pVar, App_CCD_CommCenterAppHandleEvent, Com_ID_FrmProgress);

        //缺省的事件处理循环,一般来说,不要更改
        AppDefaultEventLoop();

		//注销GUI应用,释放占用的资源
		WM_GuiAppStop();

        //应用进行本功能的资源释放工作
		mcFree(pVar);

        break;
	
	default:
		break;
    };
    
    return;	
}

⌨️ 快捷键说明

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