как использовать /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 отличается, если вы создаете другую главную, подчиненную пару, поэтому чтение от ведущего устройства получает сообщение, выданное его назначенному ведомому устройству. Я надеюсь, это поможет вам или кому-либо еще, кто столкнется с проблемой, подобной этой.


Я не знаю Python, но я могу указать вам в правильном направлении: посмотри здесь в примере кода C. Вот человек страница для /dev / ptmx. Убедитесь, что разрешения и владелец верны!. Вот плакат на linuxquestions форуме о том, как использовать его из с.


вы должны рассмотреть возможность использования 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

если он крякает, как утка, и он утка, как утка...