Я использую 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 не влияют на каноническое чтение.
Помогло оценить, как включить таймаут для такой команды чтения.
Задача ещё не решена.
Других решений пока нет …