Эмулировать последовательный порт

Можно ли создать «виртуальное» последовательное устройство, которое отправляет данные через «виртуальный» последовательный порт? Мне нужно разработать код для взаимодействия с Arduino, но у меня его нет. Можно ли это сделать с помощью socat или кода, который записывает в dev/ttyXXX файл?

РЕДАКТИРОВАТЬ: я использую Arch Linux


person joaocandre    schedule 21.03.2014    source источник
comment
Какая платформа? Linux, Windows, OSX, другие?   -  person Craig    schedule 22.03.2014
comment
@Craig забыл упомянуть, я использую Linux   -  person joaocandre    schedule 22.03.2014


Ответы (1)


Да, вы можете использовать socat для имитации последовательного порта.

Вам необходимо использовать тип адреса Socat PTY:

PTY: Generates a pseudo terminal (pty) and uses its master side. Another
process may open the pty's slave side using it like a serial line or
terminal.

Самый простой вариант:

socat PTY,link=./virtual-tty,raw,echo=0 -

Приложение, которое вы тестируете, откроется virtual-tty. Вывод из вашего приложения будет напечатан на консоли. Введенный вами текст будет отправлен в ваше приложение.

Как отмечалось выше, тип адреса PTY создает peudo-terminal. Параметр link создает мягкую ссылку между псевдотерминалом и заданным файлом. Вы можете выбрать любое имя файла, какое пожелаете. Без софт-ссылки вам нужно было бы открыть устройство, и трудно определить правильный. raw переводит псевдотерминал в необработанный режим. Обычно вы этого хотите, поскольку вам не нужны какие-либо специальные параметры обработки терминала. echo=0 отключает режим эха.

Если у вас есть (или вы создаете) приложение, которое имитирует код, выполняемый на Arduino, вы также можете подключить его через socat. Если ваш симулятор общается через stdin / stdout, используйте следующую команду:

socat PTY,link=./virtual-tty,raw,echo=0 EXEC:simulator-command

Вышеупомянутое соединение stdin / stdout simulator-command с псевдотерминалом.

Если ваш симулятор также обменивается данными через последовательный порт, то дважды используйте команду PTY:

socat PTY,link=./arduino-sim,raw,echo=0 PTY,link=./virtual-tty,raw,echo=0

Откройте симулятор arduino-sim.

person esorton    schedule 21.03.2014
comment
Именно то, что я искал. Один вопрос, однако, используя один PTY, первую команду, которую вы упомянули, как мне ввести данные в virtual-tty? И, кстати, я предполагаю, что это нормально, если мой arduino-sim использует boost::asio для последовательной связи? - person joaocandre; 22.03.2014
comment
virtual-tty аналогичен /dev/ttyUSB# в смоделированной среде. У вас будет код, который вы разрабатываете, для связи с Arduino открытым virtual-tty. Это одна сторона последовательного подключения. Данные, отправленные из кода, который вы разрабатываете, будут отображаться в stdout, и вы можете отправить данные, набрав на stdin. Это будет работать, пока связь между вашим хост-приложением и приложением Arduino осуществляется в формате ASCII. Я не знаком с boost::asio, но поскольку pty, созданный socat, является реальным pty, созданным последовательным драйвером, проблем быть не должно. - person esorton; 22.03.2014
comment
Тогда в чем именно разница между открытием только одного PTY и двух PTY, как показано в последней команде? Чтобы избежать блокировки / одновременного обращения двух программ к одному и тому же файлу? - person joaocandre; 22.03.2014
comment
Последний пример - это когда вы хотите использовать виртуальный последовательный порт для обеих сторон соединения. Вы не можете открыть один и тот же PTY дважды. Это не сработает. Подумайте об этом так: если вы соединяете два компьютера Linux через нуль-модемный кабель, вы должны открыть /dev/ttyS# на одном и /dev/ttyS# на другом. Открываешь ДВА порта. То же самое и с socat; socat аналогичен вашему нуль-модемному кабелю. Разница в том, что socat очень гибкая. Я бы порекомендовал прочитать примеры на socat странице руководства, чтобы узнать, как это можно использовать. - person esorton; 22.03.2014
comment
Используя socat PTY,link=/dev/ttySIM0,raw,echo=0 PTY,link=/dev/ttySIM1,raw,echo=0, я могу видеть создаваемые файлы устройства, однако как моя программа (использующая boost::asio), так и PuTTY, я не вижу никаких выходных данных из моей программы-симулятора (которая просто многократно отправляет '47'). Может ли это быть связано со скоростью передачи данных? Какое значение по умолчанию в socat? - person joaocandre; 22.03.2014
comment
Скорость передачи по умолчанию - 38400 бод. Вот простой тест. Откройте три терминала. Выполните приведенную выше команду за один раз. Запустите cat /dev/ttySIM1 в другом. Введите echo hello > /dev/ttySIM0 в третьем. Вы должны увидеть "привет" во втором. Просто протестировал это, и он сработал (Ubuntu 13.10). Единственная разница заключалась в том, что я сбросил /dev/, чтобы мне не приходилось работать с правами root. Если этот тест работает, замените echo вашей программой, отправляющей «47». Надеюсь, вы увидите цифру 47 на терминале с кошкой. Вы можете настроить скорость передачи в командной строке с помощью stty -F /dev/ttySIM1 9600 перед запуском cat, если это необходимо. - person esorton; 23.03.2014