私は必要最低限の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
スクリプトを置くことができますが、それで終わりです。
(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
なので、データをそのまま渡します)。
TIOCSTI
が利用可能ですが、現在ではそれほど高く評価されているメカニズムではありません。代替案は非常に単純です。これが疑似端末が行うことです。スキャナーを実際のシリアル端末ではなく疑似端末に向け、疑似端末のマスター側から適切な入力を駆動するだけです。実際、 expect
は、疑似ターミナルを介してインタラクティブなターミナルI/Oアプリケーションを駆動する準備ができています。
それはすべて、Fedoraパッケージに含まれるexpect
が、すべてをインストールした人がマシンにすでにインストールしていることを選択したものの1つであるかどうかに依存します。もちろん、これはPerlにも当てはまります。私たちの回答者は、漠然とした「素朴な」が実際に何を伴うかを知る方法がありません。
最後に私はそれを解決することができます。本当にありがとうございました。
空のテキストファイルを作成する
ファイルを編集し、このコードをコピーしてテキストファイルに貼り付けます
//**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;
}
テキストファイルをtiocsti.c
として保存します
同じディレクトリで、ターミナルでcc tiocsti.c -o tiocsti
を実行して、最初のステップで作成したtiocsti.cファイルをコンパイルします
5. ttyS0に偽の入力を生成するには、単に実行します
echo yadayada | ./tiocsti > /dev/ttyS0