RCVFAX.C
上传用户:wesley
上传日期:2007-01-07
资源大小:266k
文件大小:4k
源码类别:

通讯/手机编程

开发平台:

C/C++

  1. /* Copyright (C) 1992 Peter Edward Cann */
  2. #include<stdio.h>
  3. #include<fcntl.h>
  4. #include<time.h>
  5. #include"port.h"
  6. #define NSCANS 4
  7. unsigned char scans[NSCANS][16]=
  8. {
  9. "+FCONrn",
  10. "OKrn",
  11. "CONNECTrn",
  12. "+FHNG"
  13. };
  14. int scani[NSCANS];
  15. sendchar(c)
  16. unsigned char c;
  17. {
  18. while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)))
  19. if(kbhit())
  20. getch();
  21. outp(basereg, c);
  22. }
  23. int follow;
  24. quit()
  25. {
  26. cleanup(0);
  27. exit(99);
  28. }
  29. sendstr(str)
  30. char *str;
  31. {
  32. int i;
  33. for(i=0;str[i]!='';++i)
  34. sendchar(str[i]);
  35. }
  36. FILE *fd;
  37. int scan(seconds)
  38. int seconds;
  39. {
  40. long timestamp;
  41. int i, j;
  42. timestamp=time(NULL);
  43. for(i=0;i<NSCANS;++i)
  44. scani[i]=0;
  45. while(1)
  46. {
  47. while(follow==index)
  48. {
  49. if(kbhit())
  50. getch();
  51. if((time(NULL)-timestamp)>seconds)
  52. {
  53. for(j=0;j<NSCANS;j++)
  54. scani[j]=0;
  55. return(-1);
  56. }
  57. }
  58. fputc(buf[follow], fd);
  59. putch(buf[follow]);
  60. for(i=0;i<NSCANS;i++)
  61. if(scans[i][scani[i]]==buf[follow])
  62. {
  63. scani[i]++;
  64. if(scans[i][scani[i]]=='')
  65. {
  66. for(j=0;j<NSCANS;j++)
  67. scani[j]=0;
  68. follow++;
  69. follow%=TBUFSIZ;
  70. return(i);
  71. }
  72. }
  73. else
  74. scani[i]=0;
  75. follow++;
  76. follow%=TBUFSIZ;
  77. }
  78. }
  79. main(argc, argv)
  80. int argc;
  81. char **argv;
  82. {
  83. long timestamp;
  84. int flag;
  85. unsigned char c;
  86. char fname[256];
  87. if(argc!=5)
  88. {
  89. printf("USAGE: rcvfax <comnum> <initspeed> <afterspeed> <dir>n");
  90. exit(98);
  91. }
  92. timestamp=time(NULL);
  93. sprintf(fname, "%s\%08lx.rfx", argv[4], timestamp);
  94. printf("Opening received fax file %s.n", fname);
  95. if((fd=fopen(fname, "w"))==NULL)
  96. {
  97. printf("Error opening file %s.n", fname);
  98. exit(97);
  99. }
  100. setmode(fileno(fd), O_BINARY);
  101. comnum=atoi(argv[1])-1;
  102. speed=atoi(argv[2]);
  103. databits='8';
  104. parity='n';
  105. stopbits='1';
  106. setport();
  107. readset();
  108. follow=index=0;
  109. setup();
  110. speed=atoi(argv[3]);
  111. switch(scan(60))
  112. {
  113. case -1:
  114. cleanup(0);
  115. printf("Timeout waiting for +FCON.n");
  116. fclose(fd);
  117. unlink(fname);
  118. exit(1);
  119. break;
  120. case 0:
  121. break;
  122. case 3:
  123. cleanup(0);
  124. printf("Hangup waiting for +FCON.n");
  125. fclose(fd);
  126. unlink(fname);
  127. exit(1);
  128. break;
  129. default:
  130. cleanup(0);
  131. printf("Received recognized token other than +FCON.n");
  132. fclose(fd);
  133. unlink(fname);
  134. exit(2);
  135. break;
  136. }
  137. setport();
  138. setup();
  139. switch(scan(30))
  140. {
  141. case -1:
  142. fprintf(fd, "nTIMEOUTn");
  143. cleanup(0);
  144. printf("Timeout waiting for initial OK.n");
  145. exit(3);
  146. break;
  147. case 1:
  148. break;
  149. case 3:
  150. scan(15);
  151. cleanup(0);
  152. printf("Waiting for initial OK received +FHNG.n");
  153. exit(30);
  154. break;
  155. default:
  156. cleanup(0);
  157. printf("Waiting for initial OK received other recognized token.n");
  158. exit(4);
  159. break;
  160. }
  161. while(1)
  162. {
  163. /* Loop over pages */
  164. sendstr("AT+FDRr");
  165. switch(scan(60))
  166. {
  167. case -1:
  168. fprintf(fd, "nTIMEOUTn");
  169. cleanup(0);
  170. printf("Timeout waiting for CONNECT.n");
  171. exit(5);
  172. break;
  173. case 2:
  174. break;
  175. case 3:
  176. if(scan(15)==1)
  177. {
  178. cleanup(0);
  179. exit(0);
  180. }
  181. else
  182. {
  183. cleanup(0);
  184. printf("No OK after FHNG.n");
  185. exit(11);
  186. }
  187. default:
  188. cleanup(0);
  189. printf("Bad stuff after +FDR command.n");
  190. exit(6);
  191. break;
  192. }
  193. sendchar(0x11);
  194. flag=0;
  195. while(1)
  196. {
  197. /* Loop over characters */
  198. timestamp=time(NULL);
  199. while(follow==index)
  200. {
  201. if(kbhit())
  202. getch();
  203. if((time(NULL)-timestamp)>120)
  204. /*120 seems ridiculous, but 60 didn't do it*/
  205. {
  206. cleanup(0);
  207. fprintf(fd, "nTIMEOUTn");
  208. printf("Data timeout.n");
  209. exit(7);
  210. }
  211. }
  212. fputc(buf[follow], fd);
  213. if(buf[follow]!=0x03)
  214. flag=0;
  215. else
  216. if(flag)
  217. {
  218. follow++;
  219. follow%=TBUFSIZ;
  220. break;
  221. }
  222. if(buf[follow]==0x10)
  223. flag=1;
  224. follow++;
  225. follow%=TBUFSIZ;
  226. }
  227. switch(scan(30))
  228. {
  229. case -1:
  230. fprintf(fd, "nTIMEOUTn");
  231. cleanup(0);
  232. printf("Timeout waiting for post-data OK.n");
  233. exit(8);
  234. break;
  235. case 1:
  236. break;
  237. case 3:
  238. scan(15);
  239. printf("Hangup waiting for post-data OK.n");
  240. cleanup(0);
  241. exit(31);
  242. break;
  243. default:
  244. cleanup(0);
  245. printf("Waiting for post-data OK wrong token.n");
  246. exit(9);
  247. break;
  248. }
  249. }
  250. }