Последовательная запись в блокировку Linux, решение для тайм-аута? - PullRequest
3 голосов
/ 13 марта 2012

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

Я установил последовательный порт на неблокирующее и отключил управление потоком. Затем я использую Select, чтобы определить, когда я могу написать порт. Я пытаюсь написать большие буферы (больше, чем размер страницы, 4 КБ, что, я думаю, является объемом программной буферизации, данной порту). Первая часть записи будет выполнена, но затем я блокирую попытку записи остальных, если разорвано последовательное соединение или конечный потребитель выключен / перезагружен. Я думал о записи меньших порций данных, но чувствую, что со временем я заполню буфер и снова столкнусь с этим делом. Есть ли способ запросить доступный буфер, оставленный до записи? Способ изменить размер буфера без перекомпиляции ядра?

Моя цель - найти тайм-аут неудачных записей, чтобы я мог очистить и уведомить пользователя. Я не хочу, чтобы конец неудачного сообщения проходил прямо при возврате устройства. Серийные настройки (скорость передачи, стоп-биты и т. Д.) Также могут изменяться со временем, и я не хочу, чтобы они менялись, пока у меня может зависать запись.

Я решил, что могу послать потоку сигнал sigusr1, и это отменит текущую запись, но это не кажется таким изящным. Возможно, это предпочтительный метод? Также я рассмотрел использование aio_write, но никогда не использовал его раньше и не знаю его ограничений.

Если у кого-то есть хорошее решение для отсрочки неудачных писем, мне было бы интересно услышать их. Спасибо.

РЕДАКТИРОВАТЬ: Я провел больше расследований, и мой вопрос не был полностью правильным. Я использовал последовательные порты psuedo, и запись в них велась не так, как реальные последовательные порты. Вопрос все еще будет касаться того, включено ли аппаратное управление потоком данных или вам пришлось использовать последовательные порты psuedo.

1 Ответ

1 голос
/ 13 марта 2012

Лучше всего это сделать, отправив потоку сигнал, хотя я бы использовал timer для установки времени ожидания; если я правильно помню, это то, что я делал в прошлом (псевдокод):

timer_create();
int value = write( fd, buffer, buff_len );
if( value < 0 && errno == EINTR ) {
    /* We were interrupted by a signal - write failed. */
}else if( value < 0 ){
    timer_delete();
    /* other error */
}else if( value != buff_len){
    timer_delete();
    /* did not write out entire buffer */
}else{
    timer_delete();
    /* Write should be good */
}

см .: http://pubs.opengroup.org/onlinepubs/009604499/functions/timer_create.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...