Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> select() qnx 
:(
    Опции темы
infernalcucumber
Дата 26.5.2016, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.5.2016

Репутация: нет
Всего: нет



Добрый день, имеется следующая проблема, заранее благодарен за помощь smile

Имеется устройство, общающееся по rs485 по протоколу modbus, если ему отправить запрос, то он сразу же отвечает(проверял с помощью toolkit com port). Суть проблемы в следующем:после отправки запроса, прослушивается порт в бесконечном цикле, где не срабатывает select() на чтение, однако фактически, данные которые пришли, выводятся в консоль.
(select мне нужен для того, чтобы нормально работал запрос/прием сообщений в большом количестве)

P.S. Может быть я не правильно понимаю суть select()? Я так понимаю, он проверяет состояние порта, готов ли он читать или записывать данные, если я ошибаюсь, пожалуйста, поправьте меня.
PM   Вверх
xvr
Дата 26.5.2016, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6984
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 20
Всего: 222



Вроде правильно понимаете. Покажите код.

PM MAIL   Вверх
infernalcucumber
Дата 27.5.2016, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.5.2016

Репутация: нет
Всего: нет



Код

int main(int argc, char *argv[])
{
int com4, received_len=0;
int port=PORT4;
unsigned int speed = 9600;
struct timeval tv;
fd_set rfd;
char str[80];
int n=0;

    if (com4=SerialOpen(port) == -1)
    {
        printf("cannot_open_com_port\n");
        return 0;
    }
    if (com4=SerialSetSpeed(port,speed) == -1)
    {
        printf("cannot_set_speed\n");
        return 0;
    }
    FD_ZERO( &rfd );
    FD_SET( com4, &rfd );
    
    tv.tv_sec = 0;
    tv.tv_usec = 500000;

    while (n != 1) //ожидание разблокировки select'a
    {
        switch ( n = select( 1+ com4, &rfd, 0, 0, &tv ) )
        {
            case -1:
                perror("select");
                return EXIT_VALUE;
            case 0:
                puts("select timed out");
                break;
            default:
                printf("com port ready to receive ...\n", n);
    
        }
    }

    while (1)
    {
        if (SerialInputQueue(port) <= 1)
        {
            continue;
        }
        received_len = SerialNonBlockRead(port, str, sizeof(str));
        printf("bytes received: %d - %s\n", received_len, str);
    }
    
return 0;
}



Данные посылаю вручную, с другого компьютера, они не читаются в данной программе.

Это сообщение отредактировал(а) infernalcucumber - 28.5.2016, 20:44
PM   Вверх
xvr
Дата 27.5.2016, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6984
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 20
Всего: 222



Цитата(infernalcucumber @  27.5.2016,  10:34 Найти цитируемый пост)
    if (com=SerialOpen(port) == -1)

Эта конструкция присвоит вам в переменную com результат сравнения вызова SerialOpen(port) с -1. Я думаю, что это не то, на что вы расчитывали  smile 

Цитата
    FD_SET( com4, &rfd );
А тут вы взводите бит в rfd по переменной com4 которая вообще не инициализированна

Не удивительно, что select не работает  smile  


Это сообщение отредактировал(а) xvr - 27.5.2016, 11:57
PM MAIL   Вверх
infernalcucumber
Дата 27.5.2016, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.5.2016

Репутация: нет
Всего: нет



Извиняюсь, невнимательно набирал сообщение, опечатку исправил, проблема осталась, постоянно вываливается сообщение в консоль о таймауте.
PM   Вверх
xvr
Дата 28.5.2016, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6984
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 20
Всего: 222



Видимо проблема в том, что за 0.5 секунды данные с COM порта еще не пришли, а дальше timeout сбрасывается самим select'ом в 0, что дает немедленный выход по timeout'у. 
Вот цитате из описания select (из QNX):

Цитата

If you use select() with a timeout, you should reset the timeout value after calling select(). 


PS. В if'е скобки не забыли поставить?

PM MAIL   Вверх
infernalcucumber
Дата 28.5.2016, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.5.2016

Репутация: нет
Всего: нет



Цитата(xvr @ 28.5.2016,  12:38)
Видимо проблема в том, что за 0.5 секунды данные с COM порта еще не пришли, а дальше timeout сбрасывается самим select'ом в 0, что дает немедленный выход по timeout'у. 
Вот цитате из описания select (из QNX):

Цитата

If you use select() with a timeout, you should reset the timeout value after calling select(). 


PS. В if'е скобки не забыли поставить?

Ставил значение 1 и 5 секунд, ничего не менялось. Сейчас понял, что после вызова select() надо сбрасывать значение таймаута, но я не очень себе это предоставляю,объясните пожалуйста если кто понял.
PM   Вверх
xvr
Дата 30.5.2016, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 6984
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 20
Всего: 222



Перенесите строки 24-25 перед select (в строку 28 после открывающей фигурной скобки)

PM MAIL   Вверх
Google
  Дата 26.5.2019, 22:02 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1110 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.