У меня есть приложение, где я хочу моделировать соединение между устройством и "модемом". Устройство будет подключено к последовательному порту и будет говорить с модемом программного обеспечения через это.
Для тестирования я хочу смочь использовать ложное устройство программного обеспечения для тестирования, отправляют и получают данные.
Пример код 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 предложение обнаружилось. Это, кажется, работает достаточно хорошо.
Вероятно, лучше всего использовать pyserial для связи с последовательным портом, и вы можете просто создать фиктивную версию serial.Serial
класс, который реализует read
, readline
, write
и любые другие необходимые вам методы.
Вы на правильном пути с псевдотерминалами. Чтобы сделать это, ваше имитационное программное устройство должно сначала открыть мастер псевдотерминала - это дескриптор файла, из которого он будет читать и в который будет писать, когда будет общаться с последовательным программным обеспечением, которое вы тестируете. Затем он должен предоставить доступ и разблокировать псевдотерминал ведомого устройства, а также получить имя ведомого устройства. Затем он должен распечатать имя ведомого устройства, чтобы вы могли сказать другому программному обеспечению открыть его в качестве последовательного порта (т.е. это программное обеспечение будет открывать имя типа /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.