159

Linux でシリアル ポート アプリケーションをテストする必要がありますが、テスト マシンにはシリアル ポートが 1 つしかありません。

仮想シリアル ポートを Linux に追加し、シェルまたはスクリプトを介してデバイスをエミュレートしてアプリケーションをテストする方法はありますか?

注: ポートを再マップすることはできません。ttys2 でハードコーディングされているため、記述されているとおりにアプリケーションをテストする必要があります。

4

9 に答える 9

83

これには pty (シリアルポートが「実際のテレタイプ」である「疑似テレタイプ」) を使用できます。一方の端から を開き/dev/ptyp5、プログラムを/dev/ttyp5;にアタッチします。ttyp5シリアル ポートと同じように動作しますが、/dev/ptyp5 経由ですべての送受信を行います。

というファイルと対話するために本当に必要な場合は/dev/ttys2、古い/dev/ttys2ものを邪魔にならないように移動し、からptyp5へのシンボリックリンクを作成しttys2ます。

もちろん、 以外の数値を使用することもできますptyp5。すべてのログイン端末も pty を使用するため、重複を避けるために数値の大きいものを選択してください。

ウィキペディアには pty の詳細があります: http://en.wikipedia.org/wiki/Pseudo_terminal

于 2008-09-16T16:56:55.927 に答える
57

これにはsocatを使用します。

例えば:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11
于 2012-05-11T17:21:02.337 に答える
20

Linux 用の実際のヌル モデム エミュレータであるtty0tty http://sourceforge.net/projects/tty0tty/もあります。

これは単純なカーネル モジュールであり、小さなソース ファイルです。なぜそれが sourceforge でしか評価されなかったのかはわかりませんが、私にとってはうまく機能します。それについての最も良いことは、ハードウェア ピン (RTC/CTS DSR/DTR) もエミュレートすることです。TIOCMGET/TIOCMSET および TIOCMIWAIT iotcl コマンドも実装しています。

最近のカーネルでは、コンパイル エラーが発生する場合があります。これは簡単に修正できます。module/tty0tty.c ソースの先頭 (インクルードの後) に数行挿入するだけです:

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

モジュールがロードされると、4 組のシリアル ポートが作成されます。デバイスは /dev/tnt0 から /dev/tnt7 で、tnt0 は tnt1 に接続され、tnt2 は tnt3 に接続されます。デバイスを使用できるようにするには、ファイルのアクセス許可を修正する必要がある場合があります。

編集:

私は私の熱意で少し速かったと思います。ドライバーは有望に見えますが、不安定なようです。確かなことはわかりませんが、自宅で作業していたオフィスのマシンがクラッシュしたと思います。月曜日にオフィスに戻るまで確認できません。

2 つ目は、TIOCMIWAIT が機能しないことです。コードは、いくつかの「小さな tty」のサンプル コードからコピーされたようです。TIOCMIWAIT の処理は整っているように見えますが、wake_up_interruptible() への対応する呼び出しがないため、起動しません。

編集:

オフィスでの事故は本当に運転手のせいだった. 初期化の欠落があり、完全にテストされていない TIOCMIWAIT コードがマシンのクラッシュを引き起こしました。

昨日と今日、ドライバーの書き直しに費やしました。色々と問題がありましたが、今ではうまくいっています。ドライバーによって管理されるハードウェア フロー制御のコードがまだ不足していますが、ユーザー モード コードから TIOCMGET/TIOCMSET/TIOCMIWAIT を使用して自分でピンを管理するので、それは必要ありません。

私のバージョンのコードに興味を持っている人がいたら、私にメッセージを送ってください。

于 2012-07-07T11:01:51.393 に答える
9

カーネル ドライバーを使用して Linux 仮想シリアル ポートを作成する場合は、 Tibbo VSPDLを参照してください。かなり新しいようで、現在ダウンロード可能です (ベータ版)。現時点ではライセンスについて確信が持てないか、または将来的に商用のみで利用できるようにするかどうかは不明です.

http://www.ttyredirector.com/など、他の商用の代替手段があります。

オープン ソースでは、Remserial (GPL) も、Unix PTY を使用して、必要なことを行うことができます。シリアルデータを「生の形式」でネットワークソケットに送信します。RFC 2217 で説明されているように、後で変更することはサポートされていないようです。事前にポート速度などを設定する必要があることを除いて、com0com のような仮想ヌルモデムを作成するために 2 つの remserial インスタンスを実行できるはずです。

Socat (GPL も) は Remserial の拡張バリアントのようなもので、PTY を別のもの (Socat の別のインスタンス) にリダイレクトするための「PTY」メソッドなど、さらに多くのオプションがあります。Unit tets の場合、ファイルを PTY に直接 cat できるため、remserial よりも socat の方が適している可能性があります。マンページのPTY の例を参照してください。シリアル回線設定のネゴシエーションに RFC2217 サポートを提供するパッチが「contrib」の下にあります。

于 2008-12-01T10:58:32.877 に答える
7

以前の回答に投稿されたリンクを使用して、仮想シリアル ポートを使用して C++ で小さな例をコーディングしました。コードを GitHub にプッシュしました: https://github.com/cymait/virtual-serial-port-example

コードはかなり自明です。まず、./main master を実行してマスター プロセスを作成すると、デバイスが使用している stderr に出力されます。その後、./main スレーブ デバイスを呼び出します。ここで、device は最初のコマンドで出力されたデバイスです。

以上です。2 つのプロセス間に双方向リンクがあります。

この例を使用すると、あらゆる種類のデータを送信してアプリケーションをテストし、正しく動作するかどうかを確認できます。

また、いつでもデバイスをシンボリック リンクできるため、テストしているアプリケーションを再コンパイルする必要はありません。

于 2012-02-25T18:46:02.210 に答える
4

USB->RS232 アダプタを使用できますか? 私はいくつか持っていますが、それらは FTDI ドライバーを使用しているだけです。次に、 /dev/ttyUSB0 (または作成されたもの) の名前を /dev/ttyS2 に変更できるはずです。

于 2008-09-09T15:55:47.613 に答える
4

次の 3 つのオプションが考えられます。

RFC 2217 を実装する

RFC 2217は、あるシステム上のクライアントがローカル プログラムへのシリアル ポートをエミュレートしながら、実際にシリアル ポートを備えている別のシステム上のサーバーとデータおよび制御信号を透過的に送受信できるようにする、TCP/IP 標準への com ポートをカバーしています。概要は次のとおりです。

あなたがすることは、システムのクライアント側を PC に実装するクライアント com ポート ドライバーを見つけるか実装することです。実際のシリアル ポートのように見えますが、実際にはすべてをサーバーに転送します。このドライバーは、Digi、Lantronix などから無料で入手でき、実際のスタンドアロン シリアル ポート サーバーをサポートしている可能性があります。

次に、接続のサーバー側を別のプログラムでローカルに実装します。クライアントが接続し、必要に応じてデータと制御コマンドを発行できるようにします。

それはおそらく些細なことではありませんが、RFC が公開されており、接続の片側または両側を実装するオープン ソース プロジェクトを見つけることができるかもしれません。

Linux シリアル ポート ドライバーを変更します。

また、Linux 用のシリアル ポート ドライバー ソースはすぐに入手できます。それを利用して、ハードウェア制御部分を切り離し、単純なループバックとして、1 つのドライバーで 2 つの /dev/ttySx ポートを実行させます。次に、実際のプログラムを ttyS2 に接続し、シミュレーターを別の ttySx に接続します。

ループバックで 2 本の USB<--> シリアル ケーブルを使用する

しかし、今最も簡単なことは何ですか?2 つのシリアル ポート USB デバイスに 40 ドルを費やし、それらを接続して (ヌル モデム)、実際に 2 つの実際のシリアル ポートを用意します。1 つはテストするプログラム用で、もう 1 つはシミュレーター用です。

-アダム

于 2008-09-09T16:32:52.050 に答える