欢迎来到站长教程网!

Ubuntu

当前位置:主页 > 服务器教程 > Ubuntu >

Linux串口传输文件

时间:2020-06-08|栏目:Ubuntu|点击:

需要从FPGAm上传输文件到PC机上,下面是串口传输文件的小程序,可以测试下串口buffer的大小,我电脑上大概4K多,也可以测试串口寄存器大小读入读出大小,我这里是32bytes。

write.c

  #include   <stdlib.h>               #include   <stdio.h>    #include   <unistd.h>       #include  <string.h>          #include   <sys/types.h>     #include   <sys/stat.h>     #include   <fcntl.h>                 #include   <termios.h>             #include   <errno.h>                 #include   <sys/time.h>     #include   <time.h>        #define BUFFER_SIZE 16    #define FALSE -1    #define TRUE 1       int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,           B38400, B19200, B9600, B4800, B2400, B1200, B300, };   int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300,           38400,  19200,  9600, 4800, 2400, 1200,  300, };      void set_speed(int fd, int speed);   int set_Parity(int fd,int databits,int stopbits,int parity);      int main(int argc,char *argv[])   {       char *interface = NULL,*filename = NULL;          if (argc < 2)       {           interface = "/dev/ttyUSB0";           filename = "hello.txt"  ;       }       else        {           interface = argv[1];           filename = argv[2];        }          int fd=open(interface,O_RDWR|O_NOCTTY|O_NDELAY);          if(fd == -1)          {              printf("%s Open   Error!\n",interface);              return -1;          }        printf("open %s successfully !",interface);              set_speed(fd,19200);           if (set_Parity(fd,8,1,'N')== FALSE)       {           printf("Set Parity Error\n");           exit(1);       }             int fp = open(filename,O_RDWR);       if ( fp == -1 )       {           printf("open %s failured\n",filename);           return -1;       }       int nread = 1;       char buffer[BUFFER_SIZE] = {'\0'};       int sum = 0;          while(nread > 0)       {           int nwrite = 0;           int tmp = 0,pos=0;             nread = read(fp,buffer,BUFFER_SIZE);    //一次要写进去的字节数            printf("读取字节数 : %d bytes \n",nread);           int size_write = nread;         //size_write是要本次要写入的总字节数                while (size_write > 0)           {          //      int pos = 0>=nwrite?0:nwrite ;           //偏移    //          printf("pos = %d\n",pos);                tmp = (nwrite > tmp)? nwrite : tmp;          //                pos = tmp ;               //printf("tmp = %d,pos %d \n",tmp,pos);                    nwrite = write(fd,buffer + pos,size_write); //nwrite一次写进去的字节数                       if (nwrite == -1)               {                   sleep (2);                   continue;               }               sum = sum + nwrite;         //nwrite 8                printf("写入字节数 : %d,剩余字节数 : %d \n",sum,size_write);                 size_write = size_write-nwrite;     //剩下要写进去的字节数                            }       }       printf("sussfully  write %s\n",filename);       close(fp);       close(fd);       return 0;    }        void set_speed(int fd, int speed)   {       int   i;       int   status;       struct termios   Opt;       tcgetattr(fd, &Opt);       for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)       {           if  (speed == name_arr[i])           {               tcflush(fd, TCIOFLUSH);               cfsetispeed(&Opt, speed_arr[i]);               cfsetospeed(&Opt, speed_arr[i]);               status = tcsetattr(fd, TCSANOW, &Opt);               if (status != 0)               {                   perror("tcsetattr fd1");                   return;               }           }           tcflush(fd,TCIOFLUSH);       }   }      int set_Parity(int fd,int databits,int stopbits,int parity)   {       struct termios options;       if (tcgetattr( fd,&options)  !=  0)       {           perror("SetupSerial 1");           return(FALSE);       }       options.c_cflag &= ~CSIZE;       switch (databits) /*设置数据位数*/       {           case 7:               options.c_cflag |= CS7;               break;           case 8:               options.c_cflag |= CS8;               break;           default:               fprintf(stderr,"Unsupported data size\n");               return (FALSE);       }       switch (parity)       {           case 'n':           case 'N':               options.c_cflag &= ~PARENB;   /* Clear parity enable */               options.c_iflag &= ~INPCK;     /* Enable parity checking */               break;           case 'o':           case 'O':               options.c_cflag |= (PARODD | PARENB);  /* 设置为奇效验*/                options.c_iflag |= INPCK;             /* Disnable parity checking */               break;           case 'e':           case 'E':               options.c_cflag |= PARENB;     /* Enable parity */               options.c_cflag &= ~PARODD;   /* 转换为偶效验*/                 options.c_iflag |= INPCK;       /* Disnable parity checking */               break;           case 'S':           case 's':  /*as no parity*/               options.c_cflag &= ~PARENB;               options.c_cflag &= ~CSTOPB;               break;           default:               fprintf(stderr,"Unsupported parity\n");               return (FALSE);       }       /* 设置停止位*/          switch (stopbits)       {           case 1:               options.c_cflag &= ~CSTOPB;               break;           case 2:               options.c_cflag |= CSTOPB;               break;           default:               fprintf(stderr,"Unsupported stop bits\n");               return (FALSE);       }       /* Set input parity option */       if (parity != 'n')           options.c_iflag |= INPCK;       options.c_cc[VTIME] = 150; // 15 seconds        options.c_cc[VMIN] = 0;          tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */       if (tcsetattr(fd,TCSANOW,&options) != 0)       {           perror("SetupSerial 3");           return (FALSE);       }       return (TRUE);    }    

上一篇:lua-5.1 和 lua-5.2 之间的一些差异

栏    目:Ubuntu

下一篇:没有了

本文标题:Linux串口传输文件

本文地址:http://www.jh-floor.com/fuwuqijiaocheng/Ubuntu/125629.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号