在 Linux 中模拟来自 ttyS0 的输入

Nur*_*lim 2 linux bash serial-port

我使用简单的 RedHat Linux 机器的收银机。这些寄存器具有连接到串行端口 ( ttyS0)的扫描器。

我们进行了大量测试,需要有人站在收银机前并在扫描仪上刷产品。我试图找出一种方法来从等式中删除这个人。

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

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

echo [whatever] > /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)

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

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

这可能吗?

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

mos*_*svy 6

您可以使用TIOCSTIioctl (以 root 用户身份)执行此操作。请参阅本答案末尾的示例程序。将其用作

echo [whatever] | ./tiocsti > /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)

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

正在使用的另一个选项是在硬件中进行:只需通过 USB-> 串行适配器将机器连接到自身,然后写入/dev/ttyUSBx(或/dev/serial/by-id/xx-xx-xx)您想要读取的任何内容/dev/ttySx(make /dev/ttyUSBxrawstty raw以便它传递数据不变)。


Jde*_*eBP 6

TIOCSTI是可用的,但现在这不是一个备受推崇的机制。另一种选择非常简单:这就是伪终端所做的。只需将扫描器指向伪终端而不是真正的串行终端,并从伪终端的主端驱动适当的输入。事实上,expect通过伪终端驱动交互式终端 I/O 应用程序是现成的。

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