Терминал I/O данных DK-9000 |
Ответить |
Автор | |
Новичок Присоединился: 16 Февраль 2007 Категория: Russian Federation Online Status: Offline Публикации: 25 |
Опубликовано: 11 Сентябрь 2009 07:27 |
Уважаемые специалисты, подскажите, есть ли у кого опыт программирования на С++ работы с терминалом ввода/вывода данных DK-9000? Я общаюсь с ним по Ethernet интерфейсу и через какое-то время терминал перестает отвечать. Уходит команда, а потом моя программа уходит в ожидание ответа, на чем благополучно виснет. Может есть у кого пример работы с ним, которым можно поделиться?
|
|
Новичок Присоединился: 16 Февраль 2007 Категория: Russian Federation Online Status: Offline Публикации: 25 |
|
Отвечаю сам себе, может кому пригодится.
Выяснить почему не приходит ответ не получилось, однако вышло заставить стабильно работать. Код участка, отвечающего за общение с терминалом выглядит так (в примере показана команда вычитывания буфера клавиатуры): // Готовим строку запроса (для того чтобы не создавать новые переменные в качестве буферов для хранения команд запроса и ответа использую одну переменную) memset(&m_Keyb[0], 0, sizeof(m_Keyb)); sprintf(m_Keyb, "$%02XK\r", addr ); sendto(udp_s, m_Keyb, strlen(m_Keyb), NULL, (SOCKADDR *)&udp_sin, sizeof(udp_sin)); // Небольшая задержка, чтоб успели сформироваться данные ответные (возможно ее и не надо, но так надежнее, альтернативу пока не проверял) Sleep(10); // Проверяем можно ли читать ответ struct timeval tv; tv.tv_sec = 3; tv.tv_usec = 0; fd_set read_set; FD_ZERO(&read_set); FD_SET(udp_s, &read_set); if(select(udp_s+1, &read_set, NULL, NULL, &tv)) { if(FD_ISSET(udp_s, &read_set)) { int udp_sin_len = sizeof(udp_sin); if ((recvfrom(udp_s, m_Keyb, sizeof(m_Keyb), NULL, (SOCKADDR *)&udp_sin, &udp_sin_len) > 0) && (m_Keyb[0]=='!')) return TRUE; else { memset(m_Keyb, 0, sizeof(m_Keyb)); return FALSE; } } else return FALSE; } else { dwError = WSAGetLastError(); return FALSE; } Для чтения используется таймаут в 3 секунды. И считывается только если есть что читать, у меня стабильно работает уже несколько дней. Так как терминал всего один, то класс работы с ним красиво получилось описать при помощи шаблона Singleton. |
|
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |