C ++ Как реализовать тайм-аут в последовательной канонической связи

Я использую Ubuntu в качестве хоста и C ++ в качестве языка.

Я общаюсь с последовательным устройством, которое использует построчные команды. Для этого я выбрал канонический режим работы и мой termios флаги:

fd = open(portName.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);

struct termios config = { 0 };
config.c_iflag = IGNPAR | ICRNL;
config.c_oflag = 0;
config.c_lflag = ICANON;
config.c_lflag &= ~(ECHO | ECHONL | IEXTEN | ISIG);
config.c_cc[VINTR]    = 0;
config.c_cc[VQUIT]    = 0;
config.c_cc[VERASE]   = 0;
config.c_cc[VKILL]    = 0;
config.c_cc[VEOF]     = 4;
config.c_cc[VTIME]    = 0;
config.c_cc[VMIN]     = 0;
config.c_cc[VSWTC]    = 0;
config.c_cc[VSTART]   = 0;
config.c_cc[VSTOP]    = 0;
config.c_cc[VSUSP]    = 0;
config.c_cc[VEOL]     = 0;
config.c_cc[VREPRINT] = 0;
config.c_cc[VDISCARD] = 0;
config.c_cc[VWERASE]  = 0;
config.c_cc[VLNEXT]   = 0;
config.c_cc[VEOL2]    = 0;
if(tcsetattr(fd, TCSAFLUSH, &config) < 0)
{
std::cout << "Error configuring serial." << std::endl;
}

И простое чтение делается как:

char buffer[1024]; // 1024 bytes
read(fd, &buffer[0], 1024);

Моя проблема в том, что, если я теряю связь (т.е. когда подключенное устройство выключается), моя инструкция чтения зависает, и программа блокируется.

Мне нужно внедрить таймаут, когда он вернется с ошибкой через несколько секунд. Насколько я знаю, VTIME и VMIN не влияют на каноническое чтение.

Помогло оценить, как включить таймаут для такой команды чтения.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]