zoukankan      html  css  js  c++  java
  • 【嵌入式开发技术之串口】Linux下串口主机程序

    1. #include     <stdio.h>      /*标准输入输出定义*/   
    2. #include     <stdlib.h>     /*标准函数库定义*/   
    3. #include     <unistd.h>     /*Unix标准函数定义*/   
    4. #include     <sys/types.h>  /**/   
    5. #include     <sys/stat.h>   /**/   
    6. #include     <fcntl.h>      /*文件控制定义*/   
    7. #include     <termios.h>    /*PPSIX终端控制定义*/   
    8. #include     <errno.h>      /*错误号定义*/   
    9.   
    10. /***@brief  设置串口通信速率  
    11. *@param  fd     类型 int  打开串口的文件句柄  
    12. *@param  speed  类型 int  串口速度  
    13. *@return  void*/  
    14.   
    15. int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,   
    16.         B38400, B19200, B9600, B4800, B2400, B1200, B300, };   
    17. int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300,   
    18.         38400,  19200,  9600, 4800, 2400, 1200,  300, };   
    19. void set_speed(int fd, int speed)   
    20. {   
    21.   int   i;   
    22.   int   status;   
    23.   struct termios   Opt;   
    24.   tcgetattr(fd, &Opt);   
    25.   for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)   
    26.    {   
    27.        if  (speed == name_arr[i])   
    28.        {   
    29.            tcflush(fd, TCIOFLUSH);   
    30.         cfsetispeed(&Opt, speed_arr[i]);   
    31.         cfsetospeed(&Opt, speed_arr[i]);   
    32.         status = tcsetattr(fd, TCSANOW, &Opt);   
    33.         if  (status != 0)   
    34.             perror("tcsetattr fd1");   
    35.          return;   
    36.          }   
    37.    tcflush(fd,TCIOFLUSH);   
    38.    }   
    39. }   
    40. /**  
    41. *@brief   设置串口数据位,停止位和效验位  
    42. *@param  fd     类型  int  打开的串口文件句柄*  
    43. *@param  databits 类型  int 数据位   取值 为 7 或者8*  
    44. *@param  stopbits 类型  int 停止位   取值为 1 或者2*  
    45. *@param  parity  类型  int  效验类型 取值为N,E,O,,S  
    46. */  
    47. int set_Parity(int fd,int databits,int stopbits,int parity)   
    48. {   
    49.     struct termios options;   
    50.  if  ( tcgetattr( fd,&options)  !=  0)   
    51.   {   
    52.       perror("SetupSerial 1");   
    53.       return(FALSE);   
    54.   }   
    55.   options.c_cflag &= ~CSIZE;   
    56.   switch (databits) /*设置数据位数*/  
    57.   {   
    58.       case 7:   
    59.           options.c_cflag |= CS7;   
    60.           break;   
    61.       case 8:   
    62.         options.c_cflag |= CS8;   
    63.         break;   
    64.     default:   
    65.         fprintf(stderr,"Unsupported data size/n");   
    66.         return (FALSE);   
    67.     }   
    68.   switch (parity)   
    69.       {   
    70.       case 'n':   
    71.     case 'N':   
    72.         options.c_cflag &= ~PARENB;   /* Clear parity enable */  
    73.         options.c_iflag &= ~INPCK;     /* Enable parity checking */  
    74.         break;   
    75.     case 'o':   
    76.     case 'O':   
    77.         options.c_cflag |= (PARODD | PARENB);  /* 设置为奇效验*/    
    78.         options.c_iflag |= INPCK;             /* Disnable parity checking */  
    79.         break;   
    80.     case 'e':   
    81.     case 'E':   
    82.         options.c_cflag |= PARENB;     /* Enable parity */  
    83.         options.c_cflag &= ~PARODD;   /* 转换为偶效验*/     
    84.         options.c_iflag |= INPCK;       /* Disnable parity checking */  
    85.         break;   
    86.     case 'S':   
    87.     case 's':  /*as no parity*/  
    88.         options.c_cflag &= ~PARENB;   
    89.         options.c_cflag &= ~CSTOPB;   
    90.         break;   
    91.     default:   
    92.         fprintf(stderr,"Unsupported parity/n");   
    93.         return (FALSE);   
    94.         }   
    95.   /* 设置停止位*/      
    96.   switch (stopbits)   
    97.       {   
    98.       case 1:   
    99.           options.c_cflag &= ~CSTOPB;   
    100.         break;   
    101.     case 2:   
    102.         options.c_cflag |= CSTOPB;   
    103.         break;   
    104.     default:   
    105.         fprintf(stderr,"Unsupported stop bits/n");   
    106.         return (FALSE);   
    107.     }   
    108.   /* Set input parity option */  
    109.   if (parity != 'n')   
    110.           options.c_iflag |= INPCK;   
    111.     options.c_cc[VTIME] = 150; // 15 seconds   
    112.     options.c_cc[VMIN] = 0;   
    113.   
    114.   tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */  
    115.   if (tcsetattr(fd,TCSANOW,&options) != 0)   
    116.       {   
    117.           perror("SetupSerial 3");   
    118.         return (FALSE);   
    119.     }   
    120.   return (TRUE);   
    121.  }   
    122. /**  
    123. *@breif 打开串口  
    124. */  
    125. int OpenDev(char *Dev)   
    126. {   
    127. int    fd = open( Dev, O_RDWR );         //| O_NOCTTY | O_NDELAY   
    128.     if (-1 == fd)   
    129.         { /*设置数据位数*/  
    130.             perror("Can't Open Serial Port");   
    131.             return -1;   
    132.         }   
    133.     else  
    134.     return fd;   
    135.   
    136. }   
    137. /**  
    138. *@breif     main()  
    139. */  
    140. int main(int argc, char **argv)   
    141. {   
    142.     int fd;   
    143.     int nread;   
    144.     char buff[512];   
    145.     char *dev ="/dev/ttyS1";   
    146.     fd = OpenDev(dev);   
    147.     if (fd>0)   
    148.     set_speed(fd,19200);   
    149.     else  
    150.         {   
    151.         printf("Can't Open Serial Port!/n");   
    152.         exit(0);   
    153.         }   
    154.   if (set_Parity(fd,8,1,'N')== FALSE)   
    155.   {   
    156.     printf("Set Parity Error/n");   
    157.     exit(1);   
    158.   }   
    159.   while(1)   
    160.       {   
    161.            while((nread = read(fd,buff,512))>0)   
    162.            {   
    163.               printf("/nLen %d/n",nread);   
    164.               buff[nread+1]='/0';   
    165.               printf("/n%s",buff);   
    166.             }   
    167.       }   
    168.     //close(fd);   
    169.     //exit(0);   
    170. }  
    #include     <stdio.h>      /*标准输入输出定义*/
    #include     <stdlib.h>     /*标准函数库定义*/
    #include     <unistd.h>     /*Unix标准函数定义*/
    #include     <sys/types.h>  /**/
    #include     <sys/stat.h>   /**/
    #include     <fcntl.h>      /*文件控制定义*/
    #include     <termios.h>    /*PPSIX终端控制定义*/
    #include     <errno.h>      /*错误号定义*/
    
    /***@brief  设置串口通信速率
    *@param  fd     类型 int  打开串口的文件句柄
    *@param  speed  类型 int  串口速度
    *@return  void*/
    
    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   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);
       }
    }
    /**
    *@brief   设置串口数据位,停止位和效验位
    *@param  fd     类型  int  打开的串口文件句柄*
    *@param  databits 类型  int 数据位   取值 为 7 或者8*
    *@param  stopbits 类型  int 停止位   取值为 1 或者2*
    *@param  parity  类型  int  效验类型 取值为N,E,O,,S
    */
    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);
     }
    /**
    *@breif 打开串口
    */
    int OpenDev(char *Dev)
    {
    int    fd = open( Dev, O_RDWR );         //| O_NOCTTY | O_NDELAY
        if (-1 == fd)
            { /*设置数据位数*/
                perror("Can't Open Serial Port");
                return -1;
            }
        else
        return fd;
    
    }
    /**
    *@breif     main()
    */
    int main(int argc, char **argv)
    {
        int fd;
        int nread;
        char buff[512];
        char *dev ="/dev/ttyS1";
        fd = OpenDev(dev);
        if (fd>0)
        set_speed(fd,19200);
        else
            {
            printf("Can't Open Serial Port!/n");
            exit(0);
            }
      if (set_Parity(fd,8,1,'N')== FALSE)
      {
        printf("Set Parity Error/n");
        exit(1);
      }
      while(1)
          {
               while((nread = read(fd,buff,512))>0)
               {
                  printf("/nLen %d/n",nread);
                  buff[nread+1]='/0';
                  printf("/n%s",buff);
                }
          }
        //close(fd);
        //exit(0);
    }
  • 相关阅读:
    visual studio(vs)中项目解决方案的目录组织安排
    vs2017如果在调试状态下查看QString等qt变量的值
    终于成功编译和运行了glc_player和glc_lib
    Visual Studio(vs)内存泄漏Detected memory leaks的解决方案
    std::max、std::min error C2589: “(”:“::”右边的非法标记,error C2059:&nbs
    c++跨动态库DLL的内存分配与释放问题2
    CABasicAnimation精讲
    CAAnimation解读
    iOS CAShapeLayer精讲
    UIBezierPath精讲
  • 原文地址:https://www.cnblogs.com/spinsoft/p/2567008.html
Copyright © 2011-2022 走看看