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

📄 tmain.cpp

📁 ftplink
💻 CPP
字号:
#include <windows.h>
#include <stdio.h>
#include "resource.h"

int AddTxtHead(char *name);
int AddGtxHead(char *name);
void CutTxtHead(char *tmpname,char *name);
int Fjm(char *name);

char com[10];
char BakName[260];
HANDLE hFile;
DCB dcb,dcbold;
unsigned char wbuf[4096+1];
unsigned char ctmp;
int data_len,cmd,first_ack,first_file,last_file;
HWND DlgHwnd;

extern char PcName[260];
extern char Name[15];
extern char Path[15];
extern char Mode[10];

void print(char *p)
{	
	SendDlgItemMessage(DlgHwnd,IDC_MES,WM_SETTEXT,0,(LPARAM)p);
}

void texit()
{
	ExitThread(0);
}

int DownEdit(char *name)
{
	int i,len;
	char *p;
	len=strlen(name);
	p=name;
	for (i=len-1;i>=0;i--) {
		if (name[i]=='.') {
			p=name+i+1;
			break;
		}
	}
	if (!strcmp(p,"txt")) return AddTxtHead(name);
	else if (!strcmp(p,"gtx")) return AddGtxHead(name);
	else if (!strcmp(p,"bin")) return Fjm(name);
	return 1;
}

int UpEdit(char *name)
{
	int i,len;
	char *p;
	len=strlen(name);
	p=name;
	for (i=len-1;i>=0;i--) {
		if (name[i]=='.') {
			p=name+i+1;
			break;
		}
	}
	strcpy(BakName,name);
	if (!strcmp(p,"bin") || !strcmp(p,"gtx")) {
		print("该文件类型不支持上传!");
		return 0;
	}
	if (!strcmp(p,"txt")) {
		if (!GetTempPath(250,name)) return 0;
		strcat(name,"\\tmpfile");
	}
	return 1;
}

void UpEdit2(char *name)
{
	int i,len;
	char *p;
	len=strlen(BakName);
	p=BakName;
	for (i=len-1;i>=0;i--) {
		if (BakName[i]=='.') {
			p=BakName+i+1;
			break;
		}
	}
	if (!strcmp(p,"txt")) CutTxtHead(name,BakName);
}

void quit()
{
	print("终止传输");
	SetCommState(hFile,&dcbold);
	CloseHandle(hFile);
	texit();
}

int xwrite(unsigned char *p,unsigned long l)
{
	unsigned long n;
	if (WriteFile(hFile,p,l,&n,NULL)==0 || n!=l) {
		print("发送数据时出错");
		return 1;
	}
	return 0;
}

int xread(unsigned char *p,unsigned long l)
{
	unsigned long n;
	if (ReadFile(hFile,p,l,&n,NULL)==0 || n!=l) {
		print("接收数据时出错");
		return 1;
	}
	return 0;
}

int read_ack()
{
	unsigned long n;
	int t;
	
	if (ReadFile(hFile,&t,1,&n,NULL)==0 || n!=1) {
		print("接收到错误的响应信号");
		return 256;
	}
	t&=0xff;
	return t;
}

int wait_start()
{
	int step,t;
	t=0;
	step=0;
	for (;;) {
		t=read_ack();
		if (t==256) return 1;
		if (t=='W') step=1;
		else if (t=='Q' && step==1) step=2;
		else if (t=='X' && step==2)	break;
		else step=0;
		ctmp='L'^0xff;
		if (xwrite(&ctmp,1)) return 1;
	}
	ctmp='L';
	if (xwrite(&ctmp,1)) return 1;
	return 0;
}

int put_data()
{
	int i,t;
	t=0;
	for (i=0;i<data_len;i++) t^=wbuf[i];
	if (first_ack) {
		first_ack=0;
		do { } while (read_ack()!=5);
	} else {
		if (read_ack()!=5) return 1;
	}
	ctmp=cmd;
	if (xwrite(&ctmp,1)) return 1;
	if (xwrite((unsigned char *)(&data_len),2)) return 1;
	if (data_len==0) return 0;
	if (xwrite(wbuf,data_len)) return 1;
	ctmp=t;
	if (xwrite(&ctmp,1)) return 1;
	t=read_ack();
	if (t=='X') return 2;
	if (t!='O') return 1;
	return 0;
}

int get_data()
{
	int i,t;
	if (read_ack()!=8) return 1;
	ctmp=6;
	if (xwrite(&ctmp,1)) return 1;
	data_len=0;
	if (xread((unsigned char *)(&data_len),2)) return 1;
	if (data_len==0) return 0;
	if (xread(wbuf,data_len+1)) return 1;
	ctmp=6;
	if (xwrite(&ctmp,1)) return 1;
	t=0;
	for (i=0;i<data_len+1;i++) t^=wbuf[i];
	if (t) return 1;
	return 0;
}

int put_file(char *pcname,char *path,char *name,int attr)
{
	FILE *fp;
	int filelen,curlen;
	char s[100];

	wbuf[0]='/';
	memcpy(wbuf+1,path,strlen(path)+1);
	data_len=strlen(path)+2;
	cmd=2;
	if (put_data()) return 1;

	memcpy(wbuf,&attr,2);
	memcpy(wbuf+2,name,strlen(name)+1);
	data_len=strlen(name)+3;
	cmd=3;
	if (put_data()) return 1;

	if ((fp=fopen(pcname,"rb"))==NULL) return 1;
	fseek(fp,0,SEEK_END);
	filelen=ftell(fp);
	curlen=filelen;
	fseek(fp,0,SEEK_SET);
	for (;;) {
		sprintf(s,"%5dk",curlen/1024);
		print(s);
		data_len=fread(wbuf,1,1024,fp);
		curlen-=data_len;
		if (data_len==0) break;
		cmd=4;
		if (put_data()) {
			fclose(fp);
			return 1;
		}
	}
	fclose(fp);

	data_len=0;
	cmd=5;
	if (put_data()) return 1;

	return 0;
}

int get_file(char *pcname,char *path,char *name)
{
	FILE *fp;
	int curlen,t;
	char s[100];

	wbuf[0]='/';
	memcpy(wbuf+1,path,strlen(path)+1);
	data_len=strlen(path)+2;
	cmd=2;
	if (put_data()) return 1;

	memcpy(wbuf+2,name,strlen(name)+1);
	data_len=strlen(name)+3;
	cmd=7;
	if (put_data()) return 1;

	if ((fp=fopen(pcname,"wb"))==NULL) return 1;
	curlen=0;
	for (;;) {
		sprintf(s,"%5dk",curlen/1024);
		print(s);
xxxx:
		data_len=2;
		wbuf[0]=0;
		wbuf[1]=4;
		cmd=8;
		t=put_data();
		if (t==1) {
			fclose(fp);
			return 1;
		} else if (t==2) {
			ctmp='O'|0x80;
			if (xwrite(&ctmp,1)) return 1;
			ctmp='K'|0x80;
			if (xwrite(&ctmp,1)) return 1;
			goto xxxx;
		}
		if (get_data()) {
			fclose(fp);
			return 1;
		}
		curlen+=data_len;
		if (data_len) fwrite(wbuf,data_len,1,fp);
		if (data_len<1024) break;
	}
	fclose(fp);

	data_len=0;
	cmd=5;
	if (put_data()) return 1;

	return 0;
}

int down_file(char *name,char *path,char *pcname)
{
	if (!DownEdit(pcname)) return 1;
	if (first_file) {if (wait_start()) return 1;}

	memset(wbuf,0x20,100);
	memcpy(wbuf+45,"开始通讯!",9);
	data_len=100;
	cmd=1;
	if (put_data()) return 1;

	if (put_file(pcname,path,name,0xefef)) return 1;

	if (last_file) {
		data_len=0;
		cmd=6;
		if (put_data()) return 1;
		read_ack();
		print("传输成功。");
	}
	
	return 0;
}

int up_file(char *name,char *path,char *pcname)
{
	if (!UpEdit(pcname)) return 1;
	if (wait_start()) return 1;

	memset(wbuf,0x20,100);
	memcpy(wbuf+45,"开始通讯!",9);
	data_len=100;
	cmd=1;
	if (put_data()) return 1;

	if (get_file(pcname,path,name)) return 1;

	data_len=0;
	cmd=6;
	if (put_data()) return 1;
	read_ack();
	UpEdit2(pcname);

	print("传输成功。");
	return 0;
}

void PacDown()
{
	FILE *fp,*fp2;
	char name[260];
	char head[64];
	char s[100];
	char *p;
	short total;
	int i,j;
	long filelen;

	if ((fp=fopen(PcName,"rb"))==NULL) quit();
	if (fread(head,1,16,fp)!=16 || head[0]!='P' || head[1]!='A' || head[2]!='C' || head[3]!=' ') {
		fclose(fp);
		quit();
	}
	fread(&total,1,2,fp);
	for (i=0;i<total;i++) {
		fread(head,1,64,fp);
		filelen=*(long *)head;
		if (filelen) {
			strcpy(Path,head+4);
			p=NULL;
			for (j=0;j<60;j++)
				if (Path[j]=='/') p=Path+j;
			if (p==NULL) {
				strcpy(Name,Path);
				Path[0]=0;
			} else {
				strcpy(Name,p+1);
				*p=0;
			}
			p=(char *)malloc(filelen);
			if (p==NULL) {
				fclose(fp);
				quit();
			}
			fread(p,1,filelen,fp);
			if (!GetTempPath(250,name)) {
				free(p);
				fclose(fp);
				quit();
			}
			strcat(name,"\\tmpfile");
			if ((fp2=fopen(name,"wb"))==NULL) {
				free(p);
				fclose(fp);
				quit();
			}
			fwrite(p,1,filelen,fp2);
			fclose(fp2);
			free(p);
			sprintf(s,"下载%s",Name);
			print(s);
			first_ack=1;
			if (i) first_file=0;
			if (i+1<total) last_file=0;
			else last_file=1;
			if (down_file(Name,Path,name)) {
				fclose(fp);
				quit();
			}
		}
	}
	fclose(fp);
}

DWORD WINAPI tmain(void *p)
{
	char s[100]; 

	print("等待传输开始...");	
	hFile=CreateFile(com,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
	if (hFile==INVALID_HANDLE_VALUE) {
		sprintf(s,"无法打开串口%s!",com);
		print(s);
		texit();
	}
	GetCommState(hFile,&dcbold);
	memcpy(&dcb,&dcbold,sizeof(dcbold));
	BuildCommDCB("baud=115200 parity=N data=8 stop=1",&dcb);
	SetCommState(hFile,&dcb);

	first_ack=1;
	first_file=1;
	last_file=1;
	if (!strcmp(Path,"root")) Path[0]=0;
	if (!strcmp(Mode,"down")) {
		if (!strcmp(Name,"下载包")) PacDown();
		else if (down_file(Name,Path,PcName)) quit();
	} else if (!strcmp(Mode,"up")) {
		if (up_file(Name,Path,PcName)) quit();
	} 
	SetCommState(hFile,&dcbold);
	CloseHandle(hFile);
	texit();
	return 0;
}

⌨️ 快捷键说明

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