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