在 Linux 中模拟来自 ttyS0 的输入

在 Linux 中模拟来自 ttyS0 的输入

我使用的收银机都是赤裸裸的 RedHat Linux 机器。这些寄存器有一个连接到串行端口 ( ttyS0) 的扫描仪。

我们做了很多测试,需要有人站在收银台并在扫描仪上刷卡产品。我正在尝试找出一种方法将这个人从等式中删除。

有没有一种简单的方法来模拟串行端口的输入?

显然,向串行端口发送信息很容易:

echo [whatever] > /dev/ttyS0

但我真正喜欢的是某种 bash 代码,我可以在其中输入:

echo [barcode number] > (some code that makes the machine think the barcode number is coming from the serial port)

这可能吗?

我实际可以登记的内容也受到限制。我无法在计算机上安装任何新实用程序。我可以把bash脚本放在那里,但仅此而已。

答案1

您可以使用 ioctl 来做到这一点(作为 root)TIOCSTI。请参阅本文末尾的示例程序回答。使用它作为

echo [whatever] | ./tiocsti > /dev/ttyS0

您也可以从 perl 执行此操作,而无需编译任何内容 - 搜索此站点,有很多例子

另一种选择是我正在使用,正在硬件中进行:只需通过USB->串行适配器将机器连接到自身,然后写入/dev/ttyUSBx(或/dev/serial/by-id/xx-xx-xx)您想要读取的任何内容/dev/ttySx(使用/dev/ttyUSBx原始数据stty raw,以便它确实传递未更改的数据)。

答案2

TIOCSTI是可用的,但这并不是当今备受推崇的机制。另一种选择非常简单:这就是伪终端的作用。只需将扫描仪指向伪终端而不是真正的串行终端,然后从伪终端的主端驱动适当的输入即可。的确,expect已经准备好通过伪终端驱动交互式终端 I/O 应用程序。

这完全取决于expectFedora 软件包中的 是否是安装所有内容的人选择已安装在您的计算机上的东西之一。当然,Perl 也是如此。我们回答者无法知道模糊的“裸露”实际上意味着什么。

答案3

最后我能够解决它。非常感谢你们。

  1. 创建一个空白文本文件

  2. 编辑文件并将此代码复制并粘贴到文本文件中

//**tiocsti.c**//

#include <unistd.h>`
#include <err.h>

int main(void)
{
            char c; ssize_t r;
    while((r = read(0, &c, 1)) > 0)
    {
                    if(ioctl(1, TIOCSTI, &c)) 
        {   
            err(1, "ioctl(TIOCSTI)");
        }       
    }   
        if(r < 0)
    err(1, "read");
            return 0;
}
  1. 将文本文件另存为tiocsti.c

  2. 在同一目录中,cc tiocsti.c -o tiocsti在终端上运行以编译您在第一步中创建的 tiocsti.c 文件

5.要生成 ttyS0 的假输入,只需运行

echo yadayada | ./tiocsti > /dev/ttyS0

相关内容