Russian Qt Forum
Март 29, 2024, 10:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проверить состояние COM-порта на обрыв/отключение кабеля!  (Прочитано 3959 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Октябрь 06, 2015, 15:38 »

Доброго времени суток! Подскажите пожалуйста как можно проверить состояние COM-порта на обрыв/отключение кабеля!
Хотелось бы кроссплатформенный вариант, видимо используя QSerialPort! Есть пример кода на Linux, который эту задачу решает, но нужно более универсальное решение:

Код:
#include <sys/ioctl.h>
#include <termios.h>

int GetLine(int fd, int line)
{
   unsigned long status = 0;
   ioctl(fd, TIOCMGET, &status);
   switch(line)
   {
      case 108: return bool(status & TIOCM_DTR);
      case 107: return bool(status & TIOCM_DSR);
      case 106: return bool(status & TIOCM_CTS);
      case 105: return bool(status & TIOCM_RTS);
      case 0:   return bool(status & TIOCM_CAR);
      default:  return -1;
   };
}
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Октябрь 06, 2015, 16:41 »

Невозможно в принципе, вообще невозможно!

Если используется кабель в котором выведены сигналы RTS/CTS/RTS/CTS (и или юзается HardwareFlowControl или же удаленный девайс нарочно инициализирует свой пин RTS, состояние которого можно прочитать на другом конце через CTS), то тогда их состояние можно поллить (как в примере выше) - но это костыыыль и не факт что заработает.

См на QSerialPort::pinoutSignals().
Записан

ArchLinux x86_64 / Win10 64 bit
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #2 : Октябрь 06, 2015, 17:13 »

Невозможно в принципе, вообще невозможно!

Если используется кабель в котором выведены сигналы RTS/CTS/RTS/CTS (и или юзается HardwareFlowControl или же удаленный девайс нарочно инициализирует свой пин RTS, состояние которого можно прочитать на другом конце через CTS), то тогда их состояние можно поллить (как в примере выше) - но это костыыыль и не факт что заработает.

См на QSerialPort::pinoutSignals().

Мг.. понятно! ну выше приведенный код работает для моих целей, для Win будет
Код:
#include <windows.h>
int GetLine(void* fd, int line)
{
    Q_UNUSED(line);
    DWORD status = MS_DSR_ON;
    if(GetCommModemStatus( fd, &status ) == 0)
    {
        return false;
    }
    return bool(status & MS_DSR_ON);
}
если уже костылить до конца))) Спасибо, почитаю про QSerialPort::pinoutSignals()..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.