如何创建两个连接的串行端口的模拟?
我需要创建一个应用程序来跟踪进入端口的内容并显示。我该如何模拟这样的过程。
答案1
我以前做过这个来测试ppp
在模拟器中运行的 DOS 应用程序和我的 Debian 主机之间的连接。我使用以下快速编写的 C 程序打开并连接两个伪 tty 终端。应用程序可以像串行端口 ( /dev/tty*
) 一样使用它们,因此只需将应用程序配置为使用它们而不是真正的串行端口即可。stty
它们也可以工作,尽管波特率等当然会被忽略。
我找不到现成的实用程序,尽管它们可能存在(可能socat
带有有趣的选项)。
/* ptycat (ptypipe? ptypair?)
*
* create a pair of pseudo-terminal slaves connected to each other
*
* Link with -lutil
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <pty.h>
#undef max
#define max(x,y) ((x) > (y) ? (x) : (y))
/*
(void)ioctl(STDIN_FILENO, TIOCGWINSZ, &win);
*/
/* TODO: make symlinks, unlink on atexit */
static uint8_t buf[BUFSIZ]; /* BUFSIZ from stdio.h, at least 256 */
static char *log_dir = NULL;
void logdata (char *dir, uint8_t *data, int n) {
if (dir != log_dir) fprintf (stdout, "\n%s", dir);
log_dir = dir;
for (; n > 0; n--, data++) fprintf (stdout, " %02x", *data);
fflush (stdout);
}
int main (int argc, char* argv[])
{
char name[256]; /* max namelen = 255 for most fs. */
fd_set rfd;
struct termios tt;
struct winsize ws;
int master[2], slave[2];
int n, nfds, cc;
if (tcgetattr (STDIN_FILENO, &tt) < 0)
{
perror("Cannot get terminal attributes of stdin");
exit(1);
}
cfmakeraw (&tt);
for (int i = 0; i < 2; i++)
{
if (openpty (&master[i], &slave[i], name, &tt, NULL /*ws*/) < 0)
{
perror("Cannot open pty");
exit(1);
}
puts(name);
}
for (;;) {
FD_ZERO(&rfd);
FD_SET(master[0], &rfd);
FD_SET(master[1], &rfd);
nfds = max(master[0], master[1]) + 1;
n = select(nfds, &rfd, 0, 0, NULL);
if (n > 0 || errno == EINTR)
{
if (FD_ISSET(master[0], &rfd))
{
if ((cc = read(master[0], buf, sizeof(buf))) > 0)
{
(void) write(master[1], buf, cc);
logdata (">>>", buf, cc);
}
}
if (FD_ISSET(master[1], &rfd))
{
if ((cc = read(master[1], buf, sizeof(buf))) > 0)
{
(void) write(master[0], buf, cc);
logdata ("<<<", buf, cc);
}
}
}
}
/* This never reached */
return 0;
}
答案2
您应该能够使用pty
设备来执行此操作。我已经有一段时间没有做过这种事了。侦听器创建设备,客户端连接就像连接到设备一样TTY
。
真正的串行端口显示为/dev/ttyS0
等/dev/ttyS1
设备 pty
是用于模拟终端接口的伪终端设备。
如果您想测试两个程序,并且它们之间应该有一个串行设备,那么您应该寻找一个终端代理。它将创建两个设备并在它们之间中继数据。如果我没记错的话,有些程序会捕获带有时间戳的流量日志。