📄 tmain.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 + -