linux-C编程-串口编程

串口的select读:select读主要实现的功能是,在一定时间内不停地看串口有没有数据,有数据则进行读,当时间过去后还没有数据,则返回超时错误。


http://blog.163.com/ma95221%40126/blog/static/248221022011313303456/


#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h> /* File control definitions */
#include <errno.h>
#include <termios.h> /* POSIX terminal control definitions */
#include <time.h>


int main(int argc,char **argv)
{

  int nread,nwrite,i;

  int fd;
  fd = 0;
  fd_set rfds;



  /*打开串口*/
  if((fd = open_port(fd,1)) < 0)
  {
    perror("open_port error!\n");
    return ;
  }
  /*设置串口*/
  if((i= set_opt(fd,115200,8,'N',1)) < 0)
  {
    perror("set_opt error!\n");
    return (-1);
  }
  /*利用select函数来实现多个串口的读写*/
  FD_ZERO(&rfds);
  FD_SET(fd,&rfds);

  struct timeval tv;
  tv.tv_sec = 24;//set the rcv wait time
  tv.tv_usec = 0;//100000us = 0.1s

  char buf[2048];
  memset(buf,0,2048);
  
  //设置超时,超时就结束
  while(1)
  {
    int res = select(fd+1,&rfds,NULL,NULL,&tv);
    switch(res)
    {
      case -1:
        perror("select error!\n");
        break;
      case 0:
        printf("Time out\n" );
        break;
      default:
        if(FD_ISSET(fd,&rfds))
        {
          nread = read(fd,buf,sizeof(buf));
          if(nread<0)
            printf("read err\n" );
          else
          {
            printf("nread = %d,%s\n",nread,buf);
            memset(buf, 0 , sizeof(buf));  
          }
        }
      }
    }
  } 
  /* 不设置超时
  while(1)  
  {  
    FD_ZERO(&rfds);  
    FD_SET(fd, &rfds);  
    while(FD_ISSET(fd, &rfds))  
    {  
        if(select(fd+1, &rfds, NULL,NULL,NULL) < 0)  
        {  
            perror("select error\n");  
        }  
        else  
        {  
            while((nread = read(fd, buf, sizeof(buf))) > 0)  
            {  
                printf("nread = %d,%s\n",nread, buf);  
                memset(buf, 0 , sizeof(buf));  
            }  
        }  
    }  
  */
  close(fd);
    return 0;
}
     


你可能感兴趣的:(linux-C编程-串口编程)