c语言 - 清除串行端口的缓冲区



这是我打开串行端口的功能(使用ubuntu 12.04):

int open_port(void)
{
  int fd; /* File descriptor for the port */
  fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
  if (fd == -1)
  {
   // Could not open the port.          
   perror("open_port: Unable to open /dev/ttyUSB0 - ");
  }
  else
    fcntl(fd, F_SETFL, 0);
  struct termios options;
  tcgetattr(fd, &options); 
  //setting baud rates and stuff
  cfsetispeed(&options, B19200);
  cfsetospeed(&options, B19200);
  options.c_cflag |= (CLOCAL | CREAD);
  tcsetattr(fd, TCSANOW, &options);
  tcsetattr(fd, TCSAFLUSH, &options);
  options.c_cflag &= ~PARENB;//next 4 lines setting 8N1
  options.c_cflag &= ~CSTOPB;
  options.c_cflag &= ~CSIZE;
  options.c_cflag |= CS8;
  //options.c_cflag &= ~CNEW_RTSCTS;
  options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //raw input
  options.c_iflag &= ~(IXON | IXOFF | IXANY); //disable software flow control
  return (fd);
}

问题是,当我运行此程序以及我的串行设备已经插入时,缓冲区中有内容。在开始阅读之前,我需要一种清除缓冲区的方法。我认为使用tcsetattr(fd, TCSAFLUSH, &options);可以通过在初始化端口之前冲洗IO缓冲区来解决此问题,但没有运气。任何见解?

我想我已经弄清楚了。由于某种原因,我需要在冲洗之前添加延迟。在返回fd 之前添加的这两条行似乎完成了技巧:

  sleep(2); //required to make flush work, for some reason
  tcflush(fd,TCIOFLUSH);

此问题的原因在于使用USB串行端口。如果您使用常规串行端口,则不会遇到此问题。

大多数USB串行端口驱动程序都无法正确支持冲洗,这可能是因为无法知道内部移位寄存器,FIFO或USB子系统中是否仍然存在数据。

另请参见Greg对此处报告的类似问题的答复。

您的sleep可以解决问题,但这只是一个工作。不幸的是,除了使用常规串行端口外,没有其他解决方案。

我经历了在open()上重置的arduino uno板的类似症状。在Arduino董事会被重置之前生成的打开()呼叫后,我正在接收数据,因此在打开()之前。

通过ioctl()调用该问题,我了解到,在调用TCFlush()时,数据尚未到达输入缓冲区。因此,tcflush()确实有效,但没有数据可以刷新。打开()呼叫后的1000个我们的睡眠似乎解决了问题。这是因为延迟允许数据到达TCFlush()之前到达,因此Tcflush()确实确实冲洗了输入缓冲区。

您可能正在遇到同一问题。

最新更新