Поддельная последовательная передача в соответствии с Linux

У меня есть приложение, где я хочу моделировать соединение между устройством и "модемом". Устройство будет подключено к последовательному порту и будет говорить с модемом программного обеспечения через это.

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

Пример код Python

device = Device()
modem  = Modem()
device.connect(modem)

device.write("Hello")
modem_reply = device.read()

Теперь, в моем заключительном приложении я просто передам/dev/ttyS1 или COM1 или безотносительно чтобы приложение использовало. Но как я могу сделать это в программном обеспечении? Я запускаю Linux, и приложение записано в Python.

Я попытался делать FIFO (mkfifo ~/my_fifo) и это действительно работает, но затем мне будет нужен один FIFO для записи и один для чтения. То, что я хочу, должно открыться ~/my_fake_serial_port и читайте и запишите в это.

Я также играл с ptyмодуль, но не может заставить это работать также. Я могу получить основной и ведомый дескриптор файла от pty.openpty() но попытка читать или записать в них только вызывает IOError Bad File Descriptor сообщение об ошибке.

Обновление

Комментарии указали на меня на, ТАКИМ ОБРАЗОМ, вопросом Является там некоторая программа как COM0COM в Linux? который использует socat устанавливать виртуальное последовательное соединение. Я использовал его как это:

socat PTY,link=$HOME/COM1 PTY,link=$HOME/COM2

К остальной части Вас, спасибо за предоставление мне ценная информация. Я принял решение принять ответ Vinay Sajips, так как это - решение, которое я пошел для того, прежде чем socat предложение обнаружилось. Это, кажется, работает достаточно хорошо.

15
задан Community 23 May 2017 в 12:24
поделиться

2 ответа

Вероятно, лучше всего использовать pyserial для связи с последовательным портом, и вы можете просто создать фиктивную версию serial.Serial класс, который реализует read , readline , write и любые другие необходимые вам методы.

9
ответ дан 1 December 2019 в 04:27
поделиться

Вы на правильном пути с псевдотерминалами. Чтобы сделать это, ваше имитационное программное устройство должно сначала открыть мастер псевдотерминала - это дескриптор файла, из которого он будет читать и в который будет писать, когда будет общаться с последовательным программным обеспечением, которое вы тестируете. Затем он должен предоставить доступ и разблокировать псевдотерминал ведомого устройства, а также получить имя ведомого устройства. Затем он должен распечатать имя ведомого устройства, чтобы вы могли сказать другому программному обеспечению открыть его в качестве последовательного порта (т.е. это программное обеспечение будет открывать имя типа /dev/pts/0 вместо /dev/ttyS1).

Затем программа симулятора просто читает и записывает с ведущей стороны псевдотерминала. На языке C это выглядело бы так:

#define _XOPEN_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int pt;

    pt = open("/dev/ptmx", O_RDWR | O_NOCTTY);
    if (pt < 0)
    {
        perror("open /dev/ptmx");
        return 1;
    }

    grantpt(pt);
    unlockpt(pt);

    fprintf(stderr, "Slave device: %s\n", ptsname(pt));

    /* Now start pretending to be a modem, reading and writing "pt" */
    /* ... */
    return 0;
}

Надеюсь, это достаточно легко преобразовать в Python.

5
ответ дан 1 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: