Я написал приложение, которое должно использовать последовательные порты в Linux, особенно ttyUSB.Операции чтения и записи выполняются стандартными циклами select () / read () и write (), и в них, вероятно, нет ничего плохого, но код инициализации (или отсутствие какой-либо его части) повреждает что-то в подсистеме tty.Вот оно:
vuxboot(string filename, unsigned baud = B115200) : _debug(false) {
_fd = open(filename.c_str(), O_RDWR | O_NOCTTY);
if(_fd < 0) throw new io_error("cannot open port");
// Serial initialization was written with FTDI USB-to-serial converters
// in mind. Anyway, who wants to use non-8n1 protocol?
tcgetattr(_fd, &_termios);
termios tio = {0};
tio.c_iflag = IGNPAR;
tio.c_oflag = 0;
tio.c_cflag = baud | CLOCAL | CREAD | CS8;
tio.c_lflag = 0;
tcflush(_fd, TCIFLUSH);
tcsetattr(_fd, TCSANOW, &tio);
}
Другой tcsetattr(_fd, TCSANOW, &_termios)
находится в деструкторе, но это не имеет значения.
При инициализации или без инициализации termios в системе происходят странные вещи послеприложение выходит .Иногда обычный cat
(или hd
) немедленно прекращает печать ничего или одного и того же материала каждый раз, иногда он ожидает и не отображает какие-либо данные, которые обязательно отправляются в порт;и close()
(тоже read()
, но не каждый раз) выдает странный WARNING
в dmesg , ссылаясь на usb-serial.c .
Я проверил десятки аппаратного и микропрограммного обеспеченияраз (даже на разных машинах), и я уверен, что он работает как задумано;Более того, я удалил прошивку, чтобы просто печатать одно и то же сообщение снова и снова.
Как использовать последовательный порт, не разрушая ничего? Спасибо.