andybeg 0 12 июля, 2010 Опубликовано 12 июля, 2010 · Жалоба возвращаясь к вопросу о подчинённом устройстве - модифицированная отправка работает исправно, устройство получает команду, реагирует соответствующе, но приём который работал раньше не отрабатывает 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" ); <---------- вылетает сюда } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andybeg 0 16 июля, 2010 Опубликовано 16 июля, 2010 (изменено) · Жалоба товарищ столкнулся с сабжевой проблемой, покопался в драйвере компорта и нашёл неплохое решение - в коде в 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); Изменено 16 июля, 2010 пользователем andybeg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться