Linux下的虚假串行通信

Han*_*rén 15 python linux serial-port

我有一个应用程序,我想模拟设备和"调制解调器"之间的连接.设备将连接到串行端口,并通过它与软件调制解调器通信.

出于测试目的,我希望能够使用模拟软件设备来测试发送和接收数据.

示例Python代码

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

device.write("Hello")
modem_reply = device.read()
Run Code Online (Sandbox Code Playgroud)

现在,在我的最终应用程序中,我将只传递/ dev/ttyS1或COM1或其他任何应用程序.但是我怎么能在软件中做到这一点?我正在运行Linux,应用程序是用Python编写的.

我已经尝试制作一个FIFO(mkfifo ~/my_fifo)并且确实有效,但是我需要一个FIFO用于写入,一个用于读取.我想要的是打开~/my_fake_serial_port,读取和写入.

我也已经支付了pty模块,但也无法让它工作.我可以从中获取主从文件描述符,pty.openpty()但尝试读取或写入它们只会导致IOError Bad File Descriptor错误消息.

更新

评论向我指出了SO问题在Linux中是否有像COM0COM这样的程序?其使用socat设置一个虚拟串行连接.我用它是这样的:

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

对于其他人,感谢您给我有价值的信息.我选择接受Vinay Sajips的答案,因为这是我在提出socat建议之前所采用的解决方案.它似乎工作得很好.

Vin*_*jip 9

这也可能是最好使用pyserial与串行端口进行通信,并且你可以创建一个模拟版本,serial.Serial它实现了类read,readline,write和你需要的任何其他方法.


caf*_*caf 5

你在伪终端的正确轨道上.要做到这一点,你的模拟软件设备需要首先打开一个伪终端主机 - 当它正在与您正在测试的串行软件通信时,它将读取和写入的文件描述符.然后,它需要授予访问和解锁伪终端从属的权限,并获取从属设备的名称.然后它应该在某处打印出从设备的名称,这样你就可以告诉其他软件打开它作为它的串口(即该软件将打开一个名称/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;
}
Run Code Online (Sandbox Code Playgroud)

希望这很容易转换为Python.