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

📄 c语言编写简单的接口程序.txt

📁 一个很好的接口程序,能用于各种文件的传送
💻 TXT
字号:
用C语言编写简单的接口程序 
  
    在通信中,为了保证运行安全可靠,标准的串行口必须具有许多握手信号和状态信息。这是因为通信 
的各个计算机CPU 速度不一样(这会导致“错帧”)以及发送机发送数据速度比接收机接收速度快( 
这会导致“过冲”)。为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节 
(低4 位)的数据,而另外半个字节(高4 位)则用来传送信息。我们可以对信息位(高4 位)进行如 
下简单的编码: 
   0H:发送的是新的半个字节数据 
   1H:重新发送上次传送错误的数据 
   2H:文件名结束 
   3H:文件结束 
   这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就是发送机发送过来的 
那个字节。发送机接收到回送信号后,把它与刚发送的字节相比较,如果相同,就发送新的半个字节,否 
则就重新发送。新数据与旧数据通过信息位来区分。下面就是我用C 语言编写控制串行口的程序。以一个 
发送文件的程序为例,介绍一下用C 语言实现对接口的控制。 
   源程序为: 
#include "dos.h" 
#include "stdlib.h" 
#include "stdio.h" 
#define PORT 0 
void SendFile(char fname); 
/ *发送文件*/ 
void Send(int s);  
/ *发送一个字节*/ 
void SendFileName(char fname); 
/ *发送文件名*/ 
void ReceiveFile(); 
/ *接收文件*/ 
void GetFileName(char f); 
/ *接收文件名*/ 
void InitPort(int port,unsigned char para); 
/ *初始化端口*/ 
void SendPort(int port,char c); 
/ *端口发送*/ 
int ReadPort(int port); 
/ *读端口字节*/ 
int CheckState(int port); 
/ *检查端口状态*/ 
int Receive(int port,int G); 
/ *接收一个字节*/ 
main(argc,argv) 
  int argc; 
  char *argv[]; 
{ 
  if(argc<2){                  
    printf("Please input R(receive) 
        or S(sent) parametre:"); 
    exit(1); 
  } 
  InitPort(PORT,231); 
  if(argv[1]=='S') 
/ *检查选择的有效性*/ 
    SendFile(argv[2]); 
  else if(argv[1]=='R') 
    ReceiveFile(); 
  else{ 
    printf("Error parament.Please input again."); 
    exit(1); 
  } 
} 
void SendFile(fname) 
  char *fname; 
{ 
  FILE *fp; 
  int ch,s; 
  if(!(fp=fopen(fname,"rb"))){ 
    printf("Can't open the file.\n"); 
    exit(1); 
  } 
  SendFileName(fname); 
  do{ 
   ch=(int)getc(fp); 
   if(ferror(fp)){ 
    printf("Error reading file.\n"); 
    break; 
   } 
   s=ch %16; 
/ *取文件中一个字节的低4 位*/ 
   Send(s); 
  s=ch/16;  
/ *取文件中一个字节的高4 位*/ 
   Send(s); 
  }while(!feof(fp)); 
  s=46; / *发送文件结束信息*/ 
  Send(s); 
  Send(s); 
  fclose(fp); 
} 
void Send(s) 
  int s; 
{ 
  int G; 
  SendPort(PORT,s); 
  G=ReadPort(PORT); / *等待握手信号*/ 
  if(s!=G) 
    s=s +16; 
  do{ 
    SendPort(PORT,s); 
    G=ReadPort(PORT); / *等待握手信号*/ 
  }while(s!=G); 
} 
void SendFileName(fname) 
  char *fname; 
{ 
  int s,ch; 
  printf("Now transmit the file.Please wait..."); 
  while( *fname){ 
    ch=(int)fname ++; 
    s=ch %16; 
/ *取文件名中一个字节的低4 位*/ 
    Send(s); 
    s=ch/16; 
    Send(s); 
/ *取文件名中一个字节的低4 位*/ 
  } 
  s=32;/ *发送文件名结束标志*/ 
  Send(s); 
  Send(s); 
} 
void ReceiveFile(){ 
  FILE *fp; 
  char ch; 
  int G1,G2,G3; 
  char fname[15]; 
  GetFileName(fname); 
  printf("Receiving file %s.\n",fname); 
  remove(fname); 
  if(!(fp=fopen(fname,"wb"))){ 
    printf("Can't open output file.\n"); 
    exit(1); 
  } 
   / *循环为检测每次接受的数据是否为新数据,如果不是,则用此次接收的数据覆盖上次接收的数据*/ 
  G1=ReadPort(PORT);         
  G2=Receive(PORT, &G1); 
  do{             
    G3=Receive(PORT, &G2); 
    ch=(char)(G1 %16 +G2 *16); 
/ *恢复分开的数据, 
   组合高4 位和低4 位*/                                
    putc(ch,fp); 
    if(ferror(fp)){ 
     printf("\nError writing file."); 
     exit(1); 
    } 
    G2=Receive(PORT, &G3); 
    G1=G3; 
  }while(G1/16!=48); 
  printf("\nTransmit finished."); 
  fclose(fp); 
} 
int Receive(port,G) 
  int port, *G; 
{ 
  int GM; 
  SendPort(port, *G); 
  GM=ReadPort(port); 
  if(GM/16==0) 
    return GM; 
  else if(GM/16==1){ 
    do{ 
    *G=GM; 
    SendPort(port,GM); 
    GM=ReadPort(port); 
    }while(GM/16==1); 
  } 
  return GM; 
} 
void GetFileName(f) 
  char *f; 
{ 
  int G1,G2,G3; 
  char ch; 
  G1=ReadPort(PORT); 
  G2=ReadPort(PORT); 
  do{ 
    G3=Receive(PORT, &G3); 
    ch=(char)(G1 %16 +G2/16); 
    *f=ch; 
    *f ++; 
    G2=Receive(PORT, &G3); 
    G1=G3; 
  }while(G1/16!=32); 
  printf("File name transmit finished.\n"); 
} 
void InitPort(port,para) 
  int port; 
  unsigned char para; 
{ 
  union REGS reg; 
  reg.x.dx=port; 
  reg.h.ah=0; 
  reg.h.al=para; 
  int86(0x14, &reg, &reg); 
} 
void SendPort(port,c) 
  int port; 
  char c; 
{ 
  union REGS reg; 
  reg.x.dx=port; 
  reg.h.al=c; 
  reg.h.ah=1; 
  int86(0x14, &reg, &reg); 
  if(reg.h.ah &128){ 
    printf("\nSend mistakes!"); 
    exit(1); 
  } 
} 
int ReadPort(port) 
  int port; 
{ 
  union REGS reg; 
  while(!(CheckState(port) &256)){ 
    if(kbhit()){ / *如端口长期 
         无数据可人为终止等待*/ 
    printf("Press any key to exit."); 
    getch(); 
    exit(1); 
    } 
  } 
  reg.x.dx=port; 
  reg.h.ah=2; 
  int86(0x14, &reg, &reg); 
  if(reg.h.ah &128){ 
    printf("\nRead mistake!"); 
    exit(1); 
  } 
  return reg.h.al; 
} 
int CheckState(port) 
  int port; 
{ 
  union REGS reg; 
  reg.x.dx=port; 
  reg.h.ah=3; 
  int86(0x14, &reg, &reg); 
  return reg.x.ax; 
} 
   以上程序可传送各种格式的文件,也有一定的自动纠错能力,但对于异常情况的处理能力比较弱, 
 

⌨️ 快捷键说明

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