串口编程--本地层开发demo

来源:互联网 发布:sql distinct 用法 编辑:程序博客网 时间:2024/05/16 23:35
int serial_open(int port, int baud)
{
int fd = -1;
  int res = 0;
 
  fd = open(uart[port], O_RDWR  | O_NOCTTY | O_NDELAY);
  if (fd > 0)     
  {  
  fcntl(fd, F_SETFL, 0);
 
  if (set_serial_opts(fd, baud, 8, 'N', 1) == -1)
  {
    return -1;
  }
  }
  return fd;

}


static int set_serial_opts(int fd, int nSpeed, int nBits, char nEvent, int nStop)
 {
  int ret = -1;
 
  if (fd < 0) {
  return -1;
}


  if (tcgetattr(fd, &serial_oldtio) != 0)
  {
  goto fail;
  }
 
  bzero(&serial_newtio, sizeof(serial_newtio));
  serial_newtio.c_cflag |= CLOCAL | CREAD;
  serial_newtio.c_cflag &= ~CSIZE;
  serial_newtio.c_cflag &= ~CRTSCTS;
  serial_newtio.c_lflag &= ~(ICANON  | ECHOE |ECHO|ISIG);
  serial_newtio.c_oflag &= ~OPOST;
 
  switch (nBits)
  {
  case 7: 
  serial_newtio.c_cflag |= CS7;
break;
  case 8: 
  serial_newtio.c_cflag |= CS8;
break;
  default:
    serial_newtio.c_cflag |= CS8;
break;
  }
 
 
  switch (nEvent)
  {
  case 'O':
    serial_newtio.c_cflag |= PARENB;
    serial_newtio.c_cflag |= PARODD;
    serial_newtio.c_iflag |= (INPCK|ISTRIP);
    break;
   
  case 'E':
    serial_newtio.c_cflag |= PARENB;
    serial_newtio.c_cflag &= ~PARODD;
    serial_newtio.c_iflag |= (INPCK|ISTRIP);
    break;
  
  case 'N':
    serial_newtio.c_cflag &= ~PARENB;
    //serial_newtio.c_iflag |= INPCK;
    serial_newtio.c_iflag &= ~INPCK;
    break;
  
  default:
    serial_newtio.c_cflag &= ~PARENB;
    //serial_newtio.c_iflag |= INPCK;
    serial_newtio.c_iflag &= ~INPCK;
    break;
}
 
  switch (nSpeed)
  {
  case 9600:
    cfsetispeed(&serial_newtio, B9600);
    cfsetospeed(&serial_newtio, B9600);
    break;
  
  case 57600:
    cfsetispeed(&serial_newtio, B57600);
    cfsetospeed(&serial_newtio, B57600);
    break;
   
  case 115200:
    cfsetispeed(&serial_newtio, B115200);
    cfsetospeed(&serial_newtio, B115200);
    break;
   
  default:
    cfsetispeed(&serial_newtio, B9600);
    cfsetospeed(&serial_newtio, B9600);
    break;
  }
 
  if (nStop == 1)
  serial_newtio.c_cflag &= ~CSTOPB;
  else if (nStop == 2)
  serial_newtio.c_cflag = CSTOPB;
  
  tcflush(fd, TCIFLUSH);
  serial_newtio.c_cc[VTIME] = 100;
  serial_newtio.c_cc[VMIN] = 10;
  if (tcsetattr(fd, TCSANOW, &serial_newtio) != 0)
  {
  goto fail;
  }
 
  ret = 0;
 fail:
  return ret;
 }


long serial_read(int fd, char *buf, int len,int time)
{
long ret = -1;
int i;
  int size,vlen=0;
  //IO_READ read;

  struct timeval tv_timeout;
  //tcflush(fd, TCIFLUSH);
  FD_ZERO(&read_fds);
  FD_SET(fd, &read_fds);
  tv_timeout.tv_sec = time;
  tv_timeout.tv_usec = 0;



  //switch (select(fd+1, &read_fds, NULL, NULL, &tv_timeout))
switch (select(fd+1, &read_fds, NULL, NULL, NULL))
  {
  case -1:
tcflush(fd, TCIOFLUSH); 
    break;
    
  case 0:
tcflush(fd, TCIOFLUSH); 
    break;
    
  default:
    if (FD_ISSET(fd, &read_fds))
    {
// ioctl(fd, FIONREAD,&size);
    ret = read(fd, buf,len);
//ret = read(fd, buf,0xff);
    if (ret > 0)
   
//tcflush(fd, TCIOFLUSH);
    return ret;
    }
    else
    {
  return -1;
    }
    
    }
    break; 
  }
  return 0;
}

1 0
原创粉丝点击