首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 下串口编程入门 (3)

Linux 下串口编程入门 (3)

效验位和停止位的设置:
      
无效验8位Option.c_cflag &= ~PARENB;            
Option.c_cflag &= ~CSTOPB;            
Option.c_cflag &= ~CSIZE;            
Option.c_cflag |= ~CS8;         
奇效验(Odd)7位Option.c_cflag |= ~PARENB;            
Option.c_cflag &= ~PARODD;            
Option.c_cflag &= ~CSTOPB;            
Option.c_cflag &= ~CSIZE;            
Option.c_cflag |= ~CS7;         
偶效验(Even)7位Option.c_cflag &= ~PARENB;            
Option.c_cflag |= ~PARODD;            
Option.c_cflag &= ~CSTOPB;            
Option.c_cflag &= ~CSIZE;            
Option.c_cflag |= ~CS7;         
Space效验7位Option.c_cflag &= ~PARENB;            
Option.c_cflag &= ~CSTOPB;            
Option.c_cflag &= &~CSIZE;            
Option.c_cflag |= CS8;         
      设置效验的函数:
            
/***@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; tcflush(fd,TCIFLUSH);options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/   options.c_cc[VMIN] = 0; /* Update the options and do it NOW */if (tcsetattr(fd,TCSANOW,&options) != 0)   {         perror("SetupSerial 3");           return (FALSE);  } return (TRUE);  }

               需要注意的是:      
      如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:
            
options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/options.c_oflag  &= ~OPOST;   /*Output*/

       回页首
读写串口
      设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。
      
  • 发送数据           
    char  buffer[1024];int    Length;int    nByte;nByte = write(fd, buffer ,Length)
  • 读取串口数据          使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。
              可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。
               
    char  buff[1024];int    Len;int  readByte = read(fd,buff,Len);
      回页首
关闭串口
      关闭串口就是关闭文件。
             close(fd);
继承事业,薪火相传
返回列表