|
Уважаемые специалисты, подскажите, есть ли у кого опыт программирования на С++ работы с терминалом ввода/вывода данных DK-9000? Я общаюсь с ним по Ethernet интерфейсу и через какое-то время терминал перестает отвечать. Уходит команда, а потом моя программа уходит в ожидание ответа, на чем благополучно виснет. Может есть у кого пример работы с ним, которым можно поделиться?
|
|
Отвечаю сам себе, может кому пригодится.
Выяснить почему не приходит ответ не получилось, однако вышло заставить стабильно работать. Код участка, отвечающего за общение с терминалом выглядит так (в примере показана команда вычитывания буфера клавиатуры):
// Готовим строку запроса (для того чтобы не создавать новые переменные в качестве буферов для хранения команд запроса и ответа использую одну переменную)
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.
|