質問

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

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

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

役に立ちましたか?

解決

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

というファイルと通信するために本当に必要な場合は、 /dev/ttys2, 、古いものを移動するだけです /dev/ttys2 邪魔にならないようにしてからシンボリックリンクを作成します ptyp5ttys2.

もちろん、それ以外の番号を使用することもできます ptyp5. 。すべてのログイン端末も pty を使用するため、重複を避けるために大きい番号のものを選択することをお勧めします。

ウィキペディアには pty について詳しく記載されています。 http://en.wikipedia.org/wiki/Pseudo_terminal

他のヒント

@slonikの回答を補完します。

次の手順を実行して、socat をテストして仮想シリアル ポートを作成できます (Ubuntu 12.04 でテスト済み)。

ターミナル (ターミナル 0 と呼びます) を開いて実行します。

socat -d -d pty,raw,echo=0 pty,raw,echo=0

上記のコードは次を返します。

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

別のターミナルを開いて次のように書き込みます (ターミナル 1):

cat < /dev/pts/2

このコマンドのポート名はPCに応じて変更可能です。それは前の出力に依存します。

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

ハイライト表示された領域で利用可能な番号を使用する必要があります。

別のターミナルを開いて次のように書き込みます (ターミナル 2):

echo "Test" > /dev/pts/3

ターミナル 1 に戻ると、「Test」という文字列が表示されます。

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

例えば:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

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

これは単純なカーネル モジュール、つまり小さなソース ファイルです。なぜ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 を使用して自分でピンを管理するので、これは必要ありません。

私のバージョンのコードに興味がある人は、メッセージを送ってください。お送りします。

見てみるのもいいかもしれません ティボ VSPDL カーネル ドライバーを使用して Linux 仮想シリアル ポートを作成するためのツール -- かなり新しいようで、現在ダウンロードできます (ベータ版)。現時点ではライセンスについて、あるいは将来的にのみ商業的に利用できるようにしたいのかどうかは不明です。

他にも次のような市販の代替手段があります。 http://www.ttyredirector.com/.

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

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

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

コードは一目瞭然です。まず、./main master を実行してマスター プロセスを作成すると、デバイスが使用している標準エラー出力に出力されます。その後、./main smile device を呼び出します。ここで、device は最初のコマンドで出力されたデバイスです。

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

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

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

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

3 つの選択肢が考えられます。

RFC 2217の実装

RFC 2217 これにより、あるシステム上のクライアントがローカル プログラムに対してシリアル ポートをエミュレートしながら、実際にシリアル ポートを持つ別のシステム上のサーバーに対してデータと制御信号を透過的に送受信できるようになります。ここにあります 概要.

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

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

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

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

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

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

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

-アダム

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top