Перейти к содержанию
    

задержка в отправке пакета из буфера uart

возвращаясь к вопросу о подчинённом устройстве - модифицированная отправка работает исправно, устройство получает команду, реагирует соответствующе, но приём который работал раньше не отрабатывает

fd_set rfds;

 

struct timeval tv;

 

tv.tv_sec = 1;

tv.tv_usec = 0;

 

FD_ZERO( &rfds );

FD_SET( ttyfd, &rfds );

 

 

#ifdef DEBUG

fprintf( stderr, "Waiting for response.\n");

#endif

 

/* wait for a response */

data_avail = select( FD_SETSIZE, &rfds, NULL, NULL, &tv );

 

if( !data_avail )

{

bytes_received = 0;

fprintf( stderr, "Comms time out\n" ); <---------- вылетает сюда

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

товарищ столкнулся с сабжевой проблемой, покопался в драйвере компорта и нашёл неплохое решение - в коде в 8250.с есть строчки:

mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout) + HZ/5);

и

poll_timeout(up->port.timeout) + HZ/5);

 

я моём случае меняем на

 

mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout) + HZ/200);

и

poll_timeout(up->port.timeout) + HZ/200);

и получаем строб в 20 мс, который накрывает посылку длящуюся 9-10мс, с такими показателями можно жить.

товарищ поставил отключение строба прямо в драйвере ... я пока что отключаю после отправки write

fd = open("/dev/mem", O_RDWR);

map = mmap(0, getpagesize(), PROT_READ, MAP_SHARED, fd, UnLSR_BASE_ADDR);

if (map == MAP_FAILED)

{

#ifdef DEBUG

printf("Error mmapping the file");

setP01(1,13, 0);

#endif

return 0;

}

data = 1;

 

//ждём когда в отправляющем буфере появятся данные

goal = 10 * CLOCKS_PER_SEC / 1000 + clock();

while(data)

{

data = (U3LSR)&(1<<6);

res = (U3LSR);

#ifdef DEBUG

printf("\ndata =%x",res);

#endif

if(goal < clock())

{

#ifdef DEBUG

printf("outbuf timeout");

#endif

setP01(1,13, 0);

return 1;

}

}

//------------------------------------------------

#ifdef DEBUG

printf("\n");

#endif

//ждём когда из отправляющего буфера данные уйдут

goal = 10 * CLOCKS_PER_SEC / 1000 + clock();

while(!data)

{

data = (U3LSR)&(1<<6);

res = (U3LSR);

#ifdef DEBUG

printf("\nres =%x",res);

#endif

if(goal < clock())

{

#ifdef DEBUG

printf("sendbuf timeout");

#endif

setP01(1,13, 0);

return 1;

}

}

setP01(1,13, 0);

//------------------------------------------------

if (munmap(map, getpagesize()) == -1)

{

#ifdef DEBUG

perror("Error un-mmapping the file");

#endif

}

close(fd);

Изменено пользователем andybeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...