LINUX.ORG.RU

C и time out на чтение из порта??


0

0

Господа!!!

Помогите решить проблемму ...
Есть процедура которая считывает из com порта данные ...

while (true)
{
 res = read(dev_in,ans,1)
 if (ans[1] == 0x02) { break; }
 ...
}

Порт инициализил вот так:
 dev_opt.c_iflag = 0;
 c_cflag != (CLOCAL |CS8)
 c_cflag &= ~CSTOPB;
 c_cflag &= ~PARENB;
 c_oflag = 0;
 c_lflag = 0;

Программа моя работает ... но вот надо сделать timeout на чтение из порта ... а то иначе оно там пожизни будет вертеться ... а ентого не надыть!!!
anonymous
Ответ на: комментарий от anonymous

man 2 select :)

загоняешь дескриптор в select() и ждешь поступление в него данных или срабатываение таймаута

Dead ★★★★
()

Можно еще примерно так:

struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = sig_alarm;
act.sa_flags = SA_RESETHAND;

if(sigaction(SIGALRM, &act, 0) != 0){
perror("Could not set up timeout");
exit(-1);
}
alarm(opt.timeout);
if ( read(....) < 0) {
if (errno == EINTR) {
printf("Timeout");
.....
}
else {
perror("read");
....
}

}
alarm(0);






Dead ★★★★
()
Ответ на: комментарий от Dead

А не может-ли кто-нить написать пример с select`ом ..
 а то чего-то не понятно .. я в "c" не силен ..

anonymous
()
Ответ на: комментарий от anonymous

Пример из man 2 select ;-)

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval;

/* Ждем, пока на стандартном вводе (fd 0) что-нибудь
появится. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Ждем не больше пяти секунд. */
tv.tv_sec = 5;
tv.tv_usec = 0;

retval = select(1, &rfds, NULL, NULL, &tv);
/* Не полагаемся на значение tv! */

if (retval)
printf("Данные доступны.\n");
/* Теперь FD_ISSET(0, &rfds) вернет истинное значение. */
else
printf("Данные не появились в течение пяти секунд.\n");

exit(0);
}

Dead ★★★★
()

Кстати ещё можешь сделать break по достижении определённого момента времени. Тоесть получаеш время начала чтения порта через gettimeofday() а далее на каждой итерации проверяеш сколько прошло времени на чтение порта и соответственно делаеш break. также учти что gettimeofday возвращает текущее время через 10 мс после вызова.

А также обрати внимание на настройку порта. Там тоже устанавливается время ожидания прихода ответа. Неправильной настройкой порта можешь повесить read до прихода сигнала.

anonymous
()

Подскажите пожалуйста, где можно почитать
об инициализации порта.
Какие Флаги для чего и как это делается.
По COM-порту и LPT-порту

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.