Russian Qt Forum

Qt => Qt Embedded => Тема начата: Vladimir от Октябрь 06, 2015, 15:38



Название: Проверить состояние COM-порта на обрыв/отключение кабеля!
Отправлено: Vladimir от Октябрь 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;
   };
}


Название: Re: Проверить состояние COM-порта на обрыв/отключение кабеля!
Отправлено: kuzulis от Октябрь 06, 2015, 16:41
Невозможно в принципе, вообще невозможно!

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

См на QSerialPort::pinoutSignals().


Название: Re: Проверить состояние COM-порта на обрыв/отключение кабеля!
Отправлено: Vladimir от Октябрь 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()..