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

📄 rs 232.txt

📁 用C语言纺写的串口程序 能实现两台PC间通过串口传输数据
💻 TXT
字号:
#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(int argc,char *argv[])
{
       if(argc<2)
       {
                printf("Please input R(receive) or S(sent) parametre:");
                getch();
                exit(1);
        }
      InitPort(PORT,231);    /* 端口COM1  波特率9600bps,8位数据位,2位停止位,无奇偶校验*/

      if(*argv[1]=='S'| *argv[1]=='s') /*检查选择的有效性*/
          {
           SendFile(argv[2]);
           printf("begin to sendfile \n");
           getch();
          }
     else if(*argv[1]=='R'|argv[1]=='r')
           {
           ReceiveFile();
           printf("begin to receivefile \n");
           getch();
           }

          else
             {
             printf("Error parament.Please input again.");
             getch();
             exit(1);
             }
}



void SendFile(char *fname)          /* 发送文件*/
{
     FILE *fp;
     int ch,s;

    if((fp=fopen(fname,"rb"))==NULL)
       {
         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;                                /*strange here*/
{
      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...\n");
      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"))==NULL)
      {
         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.\n");
             exit(1);
           }
        G2=Receive(PORT,&G3);
        G1=G3;
     }while(G1/16!=48);
    printf("\nTransmit finished.\n");
    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(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");
        getch();
}


void InitPort(port,para)          /*初始化端口    */
 int port;
 unsigned char para;

{
    union REGS reg;
      reg.x.dx=port;           /* dx为端口号   COM1 为0 COM2为1*/
      reg.h.ah=0;              /* ah为功能号  0号功能为通信端口初始化*/
      reg.h.al=para;           /* al 为初始化参数 */
      int86(0x14,&reg,&reg);   /* ah=通信端口状态  al=调制解调器状态 */

}



void SendPort(port,c)          /*端口发送一字符*/
 int port;
 char c;
   {
      union REGS reg;
       reg.x.dx=port;
       reg.h.al=c;            /*向端口写c所代表的字符*/
       reg.h.ah=1;           /*   1 号功能为向通信端口写字符*/
       int86(0x14,&reg,&reg);     /*返回:AH的第7位=0,表示成功,AL内容不变;
                                          AH的第7位=1,表示失败,AL的0 6位给出端口状态。*/


       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;          /*   2 号功能为从通信端口读一字符*/
    int86(0x14,&reg,&reg);
    if(reg.h.ah&128)
      {
        printf("\nRead mistake!");
        exit(1);                  /*返回:AH的第7 位=0,表示成功,AL=读入的字符;
                                           AH的第7 位=1,表示失败,AL的0 ̄6位给出端口状态。*/
      }
   return reg.h.al;
}


int CheckState(port)        /*检查端口状态*/
int port;
{
     union REGS reg;
     reg.x.dx=port;
     reg.h.ah=3;          /*   3  号功能为返回通信端口状态*/
     int86(0x14,&reg,&reg);   /*返回:AH=端口状态
                                      AL=调制解调器状态 */
     return reg.x.ax;
}

⌨️ 快捷键说明

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