Как использовать / dev / ptmx для создания виртуального последовательного порта? - PullRequest
6 голосов
/ 01 февраля 2010

У меня есть программа, использующая 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'

edit: я нашел решение (обходной путь), используя socat.

socat PTY,link=COM8 PTY,link=COM9

, затем COM8 COM9 создаются какпара виртуальных последовательных портов.

Ответы [ 5 ]

6 голосов
/ 26 февраля 2013

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

3 голосов
/ 01 февраля 2010

За документы , вам нужно имя_пс , чтобы получить имя ведомой стороны псевдо-терминала, а также, цитируя документы,

Перед открытием псевдо-терминала раб, вы должны передать файл мастера дескриптор для grantpt (3) и unlockpt (3).

Вы можете использовать ctypes для вызова всех необходимых функций.

1 голос
/ 01 февраля 2010

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

0 голосов
/ 01 февраля 2010

Вы могли бы создать фиктивный объект, который реализует тот же интерфейс, что и используемые вами 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

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

0 голосов
/ 01 февраля 2010

Вам следует рассмотреть возможность использования модуля pty, который позаботится об этом за вас. (он открывает / dev / ptmx или вызывает openpty или открывает другое подходящее устройство в зависимости от платформы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...