web-dev-qa-db-ja.com

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スクリプトを置くことができますが、それで終わりです。

2

(rootとして)TIOCSTI ioctlを使用してそれを行うことができます。この answer の最後にあるサンプルプログラムを参照してください。として使用

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

何もコンパイルせずにPerlからそれを行うこともできます-このサイトを検索すると、たくさんの examples があります。

[〜#〜] i [〜#〜]が使用している別のオプションは、ハードウェアで実行することです。USBを介してマシンに接続するだけです。 ->シリアルアダプタ、および/dev/ttyUSBx(または/dev/serial/by-id/xx-xx-xx)読みたいものは何でも/dev/ttySx(作成/dev/ttyUSBx生のstty rawなので、データをそのまま渡します)。

6
mosvy

TIOCSTIが利用可能ですが、現在ではそれほど高く評価されているメカニズムではありません。代替案は非常に単純です。これが疑似端末が行うことです。スキャナーを実際のシリアル端末ではなく疑似端末に向け、疑似端末のマスター側から適切な入力を駆動するだけです。実際、 expect は、疑似ターミナルを介してインタラクティブなターミナルI/Oアプリケーションを駆動する準備ができています。

それはすべて、Fedoraパッケージに含まれるexpectが、すべてをインストールした人がマシンにすでにインストールしていることを選択したものの1つであるかどうかに依存します。もちろん、これはPerlにも当てはまります。私たちの回答者は、漠然とした「素朴な」が実際に何を伴うかを知る方法がありません。

6
JdeBP

最後に私はそれを解決することができます。本当にありがとうございました。

  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

1