FileOutputStream: запись в последовательный порт

Я пытаюсь записать отдельные байты в последовательный порт в Vala, используя FileOutputStream:

var dev = File.new_for_path("/dev/ttyACM0");
var dev_io = dev.open_readwrite();
var dev_o = dev_io.output_stream as FileOutputStream;
dev_o.write({0x13});
dev_o.flush();

Моя цель - сделать это похоже на echo -en '\x13' > /dev/ttyACM0, но он просто ведет себя странно. Кажется, что байт 0x13 записывается несколько раз, иногда /dev/ttyACM0 блокируется на несколько секунд, иногда даже блокируется после выхода программы Vala, а иногда вообще не блокируется. Если я запишу свой FileOutputStream в файл и отправлю его на последовательный порт через cat byte_file > /dev/ttyACM0, все будет в порядке.

Мне кажется, что GIO борется с тем, что файл является устройством. Моя проблема в том, что мне нужен GIO для мониторинга /dev/ttyACM0, если он подключен, и для асинхронного чтения.


person Genesis Rock    schedule 30.12.2013    source источник


Ответы (1)


Проблема, скорее всего, в том, что вам нужно настроить последовательный порт, чтобы установить такие параметры, как скорость передачи, управление потоком и четность. Если вы не получите все эти параметры правильно, есть большая вероятность, что вы получите мусорные данные, как вы описываете.

По сути, вам сначала нужен целочисленный дескриптор файла; самый простой способ получить его, вероятно, просто открыть файл, используя Posix.open, но вы можете также используйте GLib.FileStream.fileno, чтобы получить целочисленный дескриптор GLib.FileStream и т. д. Затем используйте Posix.cfmakeraw и Posix.cfsetspeed настроить его. Затем, чтобы получить хорошие потоки GIO, просто передайте целочисленный дескриптор в значение по умолчанию GLib.UnixInputStream< /a>/GLib.UnixOutputStream конструкторы.

Много лет назад я написал класс для обработки последовательной связи на Vala. Например, он немного ужасен — он запутан (у меня были планы использовать его как уровень абстракции), не использует GIO или async (у Vala не было ключевого слова async), использует char[] вместо uint8[ ] (мы еще не стандартизировали uint8[]) и т. д., но это должно помочь вам понять, что вам нужно делать. Между этим примером и тем, что я написал выше, вы сможете заставить его работать, но если у вас все еще возникают проблемы после того, как вы поиграли с ним, дайте мне знать, и я могу собрать быстрый пример.

person nemequ    schedule 31.12.2013