как использовать /dev/ptmx для создания виртуального последовательного порта?
у меня есть программа, использующая pyserial, и я хочу проверить ее без использования реального устройства последовательного порта.
в windows я использую com0com, а в linux, я знаю, что есть метод для создания виртуальной пары последовательных портов без использования дополнительной программы.
поэтому я ищу руководство и нашел pts, /dev / ptmx, но я не знаю, как создать пару, следуя руководству, может ли кто-нибудь дать мне пример?
я попробовал(на python):
f = open("/dev/ptmx", "r")
и это работает,/dev/pts / 4 создан.
и я попробовал:
f = open("/dev/4", "w")
в результате:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 5] Input/output error: '/dev/pts/4'
изменить: Я нашел решение (workround), используя socat.
socat PTY,link=COM8 PTY,link=COM9
затем COM8 COM9 создаются как виртуальная пара последовательных портов.
5 ответов
Per документы необходимо ptsname чтобы получить имя подчиненной стороны псевдо-терминала, а также, цитируя документы,
перед открытием псевдо-терминал раб, ты должен передать файл хозяина. дескриптор к grantpt (3) и unlockpt(3).
вы должны иметь возможность использовать ctypes
для вызова всех необходимых функций.
Я пытался сделать приложение, которое использовало виртуальные последовательные порты для связи с некоторыми удаленными устройствами с помощью преобразования TCP/Serial... и я столкнулся с проблемой, похожей на вашу. Мое решение получилось следующим образом:
import os, pty, serial
master, slave = pty.openpty()
s_name = os.ttyname(slave)
ser = serial.Serial(s_name)
# To Write to the device
ser.write('Your text')
# To read from the device
os.read(master,1000)
хотя имя порта ведущего устройства то же самое, если вы проверяете (/dev/ptmx), fd отличается, если вы создаете другую главную, подчиненную пару, поэтому чтение от ведущего устройства получает сообщение, выданное его назначенному ведомому устройству. Я надеюсь, это поможет вам или кому-либо еще, кто столкнется с проблемой, подобной этой.
вы должны рассмотреть возможность использования pty
модуль вместо этого, который должен позаботиться об этом для вас. (он открывает /dev / ptmx или вызывает openpty
или открывает другое соответствующее устройство, в зависимости от платформы.)
Вы можете создать фиктивный объект, который реализует тот же интерфейс, как pySerial
классы, которые вы используете, но делаете что-то совершенно другое и легко воспроизводимое, например, чтение и запись в файлы/терминал/и т. д.
например:
class DummySerial():
#you should consider subclassing this
def __init__(self, *args, **kwargs):
self.fIn = open("input.raw", 'r')
self.fOut = open("output.raw", 'w')
pass
def read(self, bytes = 1):
return self.fIn.read(bytes)
def write(self, data):
self.fOut.write(data)
def close(self):
self.fIn.close()
self.fOut.close()
#implement more methods here
если он крякает, как утка, и он утка, как утка...