Страниц: [1]
  Печать  
Автор Тема: Блокировка на write() при ошибочной скорости посл.порта  (Прочитано 3608 раз)
yojik
Участник
*
Offline Offline

Сообщений: 27


Просмотр профиля
« : Февраля 08, 2012, 12:44:47 pm »

Привет всем

При работе с последовательным портом есть необходимость проверить его работу на различных скоростях. На корректных для порта режимах всё проходит без проблем. Но когда скорость выставляется не поддерживаемая, то вызов write() блокируется, хотя чтение можно завершить по простою через readcond().

Собственно вопрос, можно как-то задать параметры (при открытии порта или потом), чтобы при проблеме в записи возвращалось управление программе спустя какое-то время (например, write() возвращал бы 0 ), или это можно только сделать принудительным завершением потока, в который выделяется функционал записи?

Вот как открываю порт:
fd[0] = open ( parameters.port[0], O_RDWR | O_NOCTTY );

Вот как в потоке реализована запись
void *Serial_Write(void *write_arg)
{
   struct thread_data *w;

   w = (struct thread_data *) write_arg;
   printf("Going to write to port\n");
   if ( write(w->port_num, w->buf, w->lengh) == -1 )
   {
      perror("Test write error has occurred");
      pthread_exit((void*) 1);
   }
   printf("Written to port\n");

   pthread_exit(NULL);
}

Первое отладочное сообщение появляется, второе нет. Возможно через fcntl() можно что-то изменить. Помогите, знающие люди.
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #1 : Февраля 08, 2012, 02:35:51 pm »

Непосредственно перед write использовать TimerTimeout.
Записан
vndtta
Участник
*
Offline Offline

Сообщений: 13



Просмотр профиля
« Ответ #2 : Февраля 08, 2012, 03:22:01 pm »

можно вместо write поставить select с таймаутом, типа просто проверка на готовность
Записан
yojik
Участник
*
Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #3 : Февраля 10, 2012, 11:02:17 am »

Спасибо за помощь.

С select'ом не получилось, всё равно проскакивал и блокировался

TimerTimeout проблему решил, поэтому остановился на нем Cheesy
Записан
vndtta
Участник
*
Offline Offline

Сообщений: 13



Просмотр профиля
« Ответ #4 : Февраля 10, 2012, 04:51:55 pm »

С select'ом не получилось, всё равно проскакивал и блокировался

т.е. select тебе сказал, что дескриптор готов на запись, а он потом заблокировался по записи?
Записан
yojik
Участник
*
Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #5 : Февраля 16, 2012, 11:54:41 am »

т.е. select тебе сказал, что дескриптор готов на запись, а он потом заблокировался по записи?
Да, select выполнился, но на записи всё равно потом заблокировался, хотя может я что-то не так сделал. В итоге сделал вот так:
Код:
event.sigev_notify = SIGEV_UNBLOCK;
timeout.tv_sec = w->time;
timeout.tv_nsec = 0;
timer_timeout( CLOCK_REALTIME, _NTO_TIMEOUT_SEND | _NTO_TIMEOUT_REPLY, &event, &timeout, NULL );
И все заработало, как планировал
Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #6 : Февраля 16, 2012, 12:18:27 pm »

для таймеров всё ж лучше CLOCK_MONOTONIC использовать
Записан
yojik
Участник
*
Offline Offline

Сообщений: 27


Просмотр профиля
« Ответ #7 : Февраля 21, 2012, 05:57:57 pm »

для таймеров всё ж лучше CLOCK_MONOTONIC использовать
Ок, на хабре оценил возможную проблему, которую он решает Wink
Записан
Страниц: [1]
  Печать  
 
Перейти в: