2011-01-06 3 views
0

Я пытаюсь читать двоичные данные с последовательного устройства в c на linux. Проблема в том, что иногда во внутреннем буфере драйвера есть символы, но опрос (с помощью select (2)) возвращает сообщение о том, что устройство не готово к чтению.uart buffer не читается

Я прочитал и перечитал человека термисонов и всех связанных мужчин и искал через Интернет. Я считаю, что я правильно установил все флаги (а именно VTIME, VMIN) и отключил ICANON. Я также попытался использовать функцию «tcmakeraw», но это не решило проблему.

У вас, ребята, есть идеи о том, что мне делать?

С наилучшими пожеланиями & Заранее спасибо Yannay

+3

Прикрепите код ... – BlueDog

+1

Помните, что вы повторно заполняете 'readfds' перед * каждым * вызовом' select() '? – caf

+0

Какой тип последовательного порта? (т. е. настоящий 16550, клон 16550, USB-конвертер, bluetooth, irda, ...) –

ответ

0

Что происходит, когда вы читаете непосредственно (не через C) /dev/ttyS0 (или эквив) после того как вы setserial ваши параметры. Можете ли вы получить необходимые данные за пределами select()?

+0

Единственными установленными флагами являются: CREAD, CLOACL, CS8, NL0, CR0, TAB0, BS0, VT0, FF0. скорость передачи установлена ​​правильно. VMIN = 1, VTIME = 0. Однако проблема не решена/я пытаюсь читать без выбора. просто читать и не возвращать байта. – yannay

1

Вы должны показать нам код. Я бы начал использовать cfmakeraw на последовательном порту. Как только у вас есть вещи, работающие в сыром режиме, вы можете внести изменения и посмотреть, как они работают. Вот список вопросов или вещей, которые вы можете проверить:

  • после изменения атрибута, используя, например cfmakeraw, вы называете tcsetattr (...), чтобы применить изменения?

  • Как вы подтверждаете, что в буфере приема драйвера все еще есть данные?

  • Вы проверяете системный вызов на наличие ошибок?

  • Что является результатом stracing вашей программы?

Редактировать на основе ваших комментариев: Ваш протокол «гарантия» .... => проверить предположение! Неконтролируемая, кристально чистый гарантия хороший coandidate для «невозможных ошибок»

В принципе: либо select is broken, или вашего драйвера последовательного порта. Причина, по которой прерывается последовательный драйвер, - это оборудование, которое недостаточно полно, чтобы вызвать прерывание или прерывать прерывание.

+0

1. Да. 2. его сложный. протокол, который я использую, гарантирует ACK после каждого сообщения. Иногда я не получаю ack, если больше данных не отправлено с устройства. Я 100%, это не проблема. 3. Конечно. 4. Я попробую, если все не удастся ... – yannay

Смежные вопросы