Очистка буфера последовательного порта

Вот как моя функция выглядит, чтобы открыть последовательный порт (используя 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); решит эту проблему, очистив буферы ввода-вывода перед инициализацией порта, но не повезло. Любое понимание?

Ответы на вопрос(3)

рта USB. Если вы используете обычный последовательный порт, у вас не будет этой проблемы.

Большинство драйверов последовательного порта USB нене поддерживает правильную промывку, вероятно, потому чтонет никакого способа узнать, есть лисохраняют данные во внутреннем сдвиговом регистре, FIFO или в подсистеме USB.

Смотри также Грегответ на аналогичную проблему, о которой сообщалось ранееВот.

Вашsleep может вылечить проблему, но этоЭто всего лишь обходной путь. К сожалению, нет другого решения, кроме как использовать обычный последовательный порт.

что я понял это. По какой-то причине мне нужно добавить задержку перед сбросом. Эти две строки добавлены перед возвратомfd казаться чтобы сделать трюк:

  sleep(2); //required to make flush work, for some reason
  tcflush(fd,TCIOFLUSH);
 Nathan Lilienthal13 июн. 2013 г., 06:57
+1 яЯ немного озадачен этим.
 seereddi sekhar27 апр. 2017 г., 09:40
ааа, человек, который спал работал как шарм
 markus_p22 окт. 2012 г., 17:36
надеюсь, кто-то может просветить нас, почему это работает :-)
 Dmitry05 июл. 2017 г., 12:01
Linux 4.8.0, Ubuntu 16.04x64, cp210x Драйвер USB UART (USB VID / PID: 10c4: ea60) - возникла та же проблема с этой настройкой. Решение: положитьusleep(10000); послеopen(), Две секунды слишком длинны, но 1000us, предложенное @areslagae, было слишком коротким. 10 мс как раз в моем случае.
 Étienne28 мар. 2014 г., 09:37
Я думаю, что это была ошибка в ядре Linux: см.lkml.iu.edu//hypermail/linux/kernel/0707.3/1776.html

которая сбрасывается при открытии (). Я получал данные после вызова open (), который был сгенерирован до сброса платы Arduino и, следовательно, до вызова open ().

Отслеживая проблему с вызовами ioctl (), я узнал, что к моменту вызова tcflush () данные просто еще не поступили во входной буфер. Таким образом, tcflush () работал, но данных для очистки не было. Казалось, что спящий 1000 us после вызова open () решил проблему. Это происходит потому, что задержка позволила данным прибыть до вызова tcflush () и, следовательно, tcflush () действительно очистила входной буфер.

Возможно, вы испытываете ту же проблему.

 Oscar14 мая 2018 г., 15:43
Наконец, я не единственный.

Ваш ответ на вопрос