• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用C語言編寫簡單的接口程序<轉>

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    在通信中,為了保證運行 安全 可靠,標準的串行口必須具有許多握手信號和狀態信息。這是因為通信的各個計算機CPU 速度不一樣(這會導致“錯
        在通信中,為了保證運行安全可靠,標準的串行口必須具有許多握手信號和狀態信息。這是因為通信的各個計算機CPU 速度不一樣(這會導致“錯幀”)以及發送機發送數據速度比接收機接收速度快(這會導致“過沖”)。為解決這個問題,我們采用一個簡單的握手信號,即發送機每次僅發送半個字節(低4 位)的數據,而另外半個字節(高4 位)則用來傳送信息。我們可以對信息位(高4 位)進行如下簡單的編碼:

    原文鏈接:用C語言編寫簡單的接口程序

     
      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);
      ?。猣=ch;
      ?。猣 ++;
       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;
    }
      以上程序可傳送各種格式的文件,也有一定的自動糾錯能力,但對于異常情況的處理能力比較弱,讀者可以自己改進。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>