2013-05-06 2 views
1

У меня есть последовательная программа, соединяющая два устройства через два разных порта. Всякий раз, когда я читаю, конечно, у меня есть локальный буфер с выделенным статическим размером пакета, который я готов прочитать из serial. Мой босс, однако, отметил, что сохранение пакетов в этот локальный буфер не будет безопасным, скорее он посоветовал проверить, могу ли я очищать буфер ОС Linux каждый раз, когда я читаю из последовательного. Каково твое мнение? и как я могу сделать это программно в ubuntu?flush linux OS последовательный буфер

Я думаю, что эта проблема будет решена, если я добавлю TCSAFLUSH к функции tcsetattr. это заставляет его очищать буфер после того, как все данные были записаны в последовательный. это происходит непосредственно перед следующим чтением. надеюсь, если я буду спать() в течение некоторого времени;) что, если ваше мнение?

+0

TTY обычно управляется как обычный файл, вы можете fflush(). Поэтому промывка имеет смысл при написании. При чтении просто потребляют все байты. – BigMike

+0

Я говорю это, потому что соединение может быть шумным. поэтому, просто используя fflush() после записи write(), не так ли? – Sam

+0

С тех пор, как я играл с RS232 в C, на самом деле он сбросил бы все оставшиеся байты в TTY. – BigMike

ответ

-1

Функция, которую вы ищете, является tcdrain(fd) или tcsetattr() опцией TCSADRAIN.

TCSAFLUSHtcflush()) опустошить буфер не отбрасывая данные - tcdrain() ожидания (блокирование), пока все данные были отправлены из буфера:

управления Линия

...

tcdrain() ожидает, пока не будет передан весь вывод, записанный в объект, на который ссылается fd.

- мужчина termios

Я использую функцию непосредственно перед сбросом параметров порта, что они были, прежде чем я изменил их и закрыть порт:

void SerialPort::close() { 
    if (_fd > -1) { 
     tcdrain(_fd); 
     ioctl(_fd, TCSETS2, &_savedOptions); 
     ::close(_fd); 
    } 
    _fd = -1; 
} 
Смежные вопросы