- 注册时间
- 2004-11-27
- 最后登录
- 1970-1-1
|
由于我没有TC808和那个所谓内部使用的编译器,只好贴出来了。- //这个是按照PC端的FTPLINK文件下载的协议编写的
- //目的是使WQX能与装有SYS-TOOLS.bin的WQX有线通讯
- //对方使用“文件传输”,已方使用这个程序
- //TC800上编译的,与PC2300的尝试失败,好像是硬件的原因,总是在对方断掉了才收到几个数
- //现在改成了TC808的
- //做得有些简陋
- //注意对方是使用SYS-TOOLS的文件传输
- #define TRUE -1
- #define FALSE 0
- #define _EXEC 0
- #define _SHOW_TEXT 1
- #define _CH_DIR 2
- #define _FILE_OPEN_W 3
- #define _FILE_WRITE 4
- #define _FILE_CLOSE 5
- #define _END 6
- #define _FILE_OPEN_R 7
- #define _FILE_RD_UP 8
- #define MAX_RETRY 100
- #define MAX_FAILURE 100
- #define CANT_CONNECT 1
- #define FAILED 2
- #define CANCELED 3
- char buffer[4096]; //缓冲
- void die(int n)
- {
- close_uart();
- SetScreen(1);
- if(n==CANT_CONNECT) printf("\n无法建立接连!");
- if(n==FAILED) printf("\n通迅失败!");
- if(n==CANCELED) printf("\n通迅被取消!");
- getchar();
- exit(0);
- }
- void wait(int s)
- {
- while(s--)
- {
- if(Inkey()==27) die(CANCELED);
- putchar('.');
- Delay(1000);
- }
- }
- int nthstrinstr(int s1,int s2,int n) //返回s2中s1第n次出现的位置,n<0返回最后一个的位置,n=0返回出现次数
- {
- int cur,next,count;
- if(!n) n=-1;
- next=strstr(s2,s1);
- while(next&&(n--))
- {
- cur=next;
- next=strstr(cur+strlen(s1),s1);
- count++;
- }
- if(n!=-1) return count;
- else return cur-s2+1;
- }
- long choose(int path) //path至少应初始化为"/"
- {
- char tmp[15];
- ChDir("/");
- for(;;)
- {
- if(!FileList(tmp)||!strcmp(tmp,".."))
- {
- if(nthstrinstr("/",path,0)==1) return FALSE;
- else
- {
- ChDir(".."); //上级目录
- *(path+strlen(path)-1)=0; //去掉最后一个"/"
- *(path+nthstrinstr("/",path,-1)-1)=0; //同上
- continue;
- }
- }
- strcat(path,tmp);
- if(ChDir(tmp)) strcat(path,"/");
- else return TRUE;
- }
- }
- long fsize(int path)
- {
- char fp;
- long sz;
- fp=fopen(path,"ab+");
- sz=ftell(fp);
- fclose(fp);
- return sz;
- }
- char getXorVal(int data,int sz)
- {
- char xor;
- int i;
- for(i=0;i<sz;i++)
- xor=xor^(*(data+i));
- return xor;
- }
- void ComRead(int ptr,int sz)
- {
- int i,tmp,failure;
- while(i<sz&&failure<MAX_FAILURE)
- {
- tmp=read_uart()
- if(tmp>0xff) *(ptr+i++)=tmp&0xff;
- else failure++;
- }
- if(failure>=MAX_FAILURE) die(FAILED);
- }
- void ComWrite(int ptr,int sz)
- {
- int i;
- for(i=0;i<sz;i++)
- uart_write(*(ptr+i));
- }
- void start()
- {
- int retry;
- memset(buffer,0,4);
- open_uart(1); //baud rate is set to 115200
- for(retry=0;retry<MAX_RETRY;retry++)
- {
- ComRead(buffer,3);
- if(strcmp(buffer,"WQX")==0)
- {
- write_uart(0x4c);
- break;
- }
- }
- if(retry>=MAX_RETRY) die(CANT_CONNECT);
- }
- void reset()
- {
- write_uart(0xcf);
- write_uart(0xcb);
- }
- void sendCommandData(char command,int data,int sz)
- {
- char xor;
- int failure;
- xor=getXorVal(data,sz);
- for(failure=0;failure<MAX_FAILURE;failure++)
- {
- if(read_uart()&0xff!=5)
- {
- reset();
- continue;
- }
- write_uart(command);
- write_uart(sz%256);
- write_uart(sz/256);
- if(sz==0) break;
- else
- {
- ComWrite(data,sz);
- write_uart(xor);
- if(read_uart()&0xff=='O') break;
- else reset();
- }
- }
- if(failure>=MAX_FAILURE) die(FAILED);
- }
- void sendText()
- {
- char text[100];
- strcpy(text," 开始通迅 by ttheaven ");
- sendCommandData(_SHOW_TEXT,text,100);
- }
- void sendFolderName(int path)//逐层发送目录名
- /*如"/xxx/yyy/zzz.bin"将依次发送"/xxx","/yyy"*/
- {
- char foldername[15],i;
- i=nthstrinstr("/",path,0);
- for(;i>1;i--)
- {
- memset(foldername,0,15);
- memcpy(foldername,path,nthstrinstr("/",path,2)-1);
- memmove(path,path+nthstrinstr("/",path,2)-1,strlen(path));
- sendCommandData(_CH_DIR,foldername,15);
- putchar('.');
- }
- }
- void sendFile(int path)
- {
- char fp;
- long fsz,sent,csz;
- fsz=fsize(path);
- fp=fopen(path,"r");
- sendCommandData(_FILE_OPEN_W,path,strlen(path)+1);
- while(sent<fsz)
- {
- csz=fread(buffer,1,4096,fp);
- sent=sent+csz;
- sendCommandData(_FILE_WRITE,buffer,csz);
- putchar('.');
- }
- fclose(fp);
- sendCommandData(_FILE_CLOSE,0,0);
- }
- void end()
- {
- loop:
- sendCommandData(_END,0,0);
- if(read_uart()&0xff!='E') goto loop;
- close_uart();
- }
- void SEND()
- {
- char fullname[60];
- strcpy(fullname,"/");
- if(choose(fullname))
- {
- SetScreen(1);
- printf("即将开始发送文件");
- wait(3);
- start();
- sendText();
- printf("\n发送目录名称");
- sendFolderName(fullname);
- printf("\n发送文件");
- sendFile(fullname);
- end();
- printf("\n通迅结束...");
- }
- else die(CANCELED);
- }
- void main()
- {
- SEND();
- }
复制代码 |
|