Я чувствую, что это должно быть обычное состояние ошибки для последовательной связи, но я еще не нашел хорошего решения.
Я установил последовательный порт на неблокирующее и отключил управление потоком. Затем я использую Select, чтобы определить, когда я могу написать порт. Я пытаюсь написать большие буферы (больше, чем размер страницы, 4 КБ, что, я думаю, является объемом программной буферизации, данной порту). Первая часть записи будет выполнена, но затем я блокирую попытку записи остальных, если разорвано последовательное соединение или конечный потребитель выключен / перезагружен. Я думал о записи меньших порций данных, но чувствую, что со временем я заполню буфер и снова столкнусь с этим делом. Есть ли способ запросить доступный буфер, оставленный до записи? Способ изменить размер буфера без перекомпиляции ядра?
Моя цель - найти тайм-аут неудачных записей, чтобы я мог очистить и уведомить пользователя. Я не хочу, чтобы конец неудачного сообщения проходил прямо при возврате устройства. Серийные настройки (скорость передачи, стоп-биты и т. Д.) Также могут изменяться со временем, и я не хочу, чтобы они менялись, пока у меня может зависать запись.
Я решил, что могу послать потоку сигнал sigusr1, и это отменит текущую запись, но это не кажется таким изящным. Возможно, это предпочтительный метод? Также я рассмотрел использование aio_write, но никогда не использовал его раньше и не знаю его ограничений.
Если у кого-то есть хорошее решение для отсрочки неудачных писем, мне было бы интересно услышать их. Спасибо.
РЕДАКТИРОВАТЬ: Я провел больше расследований, и мой вопрос не был полностью правильным. Я использовал последовательные порты psuedo, и запись в них велась не так, как реальные последовательные порты. Вопрос все еще будет касаться того, включено ли аппаратное управление потоком данных или вам пришлось использовать последовательные порты psuedo.