回答:
これには、pty(シリアルポートが「実際のテレタイプ」である「疑似テレタイプ」)を使用できます。一端からを開き/dev/ptyp5
、次にプログラムをに接続します/dev/ttyp5
。ttyp5
シリアルポートのように動作しますが、/ dev / ptyp5を介してすべてのことを送受信します。
と呼ばれるファイルと通信するために本当に必要な場合は/dev/ttys2
、古いファイルを/dev/ttys2
邪魔にならない場所に移動し、シンボリックリンクをからに作成ptyp5
しttys2
ます。
もちろん、以外の数を使用することもできます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」という文字列が表示されます。
link=/path/to/link
各デバイス宣言の後(echo = 0の後)に再現可能なファイル名を使用する場合。したがって、自動テストで使用できます。(slonikが回答で行うように)
socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0
。
/dev/ttyS0
ではなく、次のような名前のシリアルポートを作成でき/dev/pts/1
ますか?
これにはsocatを使用します。
例えば:
socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11
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を使用して自分でピンを管理するので、それは必要ありません。
私のバージョンのコードに誰かが興味を持っている場合は、私にメッセージを送ってください。それをお送りします。
カーネルドライバーを使用してLinux仮想シリアルポートを作成するためのTibbo VSPDLを確認することをお勧めします。これはかなり新しいようで、今すぐダウンロードできます(ベータ版)。この時点でのライセンスについて、または将来的にのみ商用利用できるようにするかどうかは不明です。
http://www.ttyredirector.com/などの他の商用の代替手段があります。
オープンソースでは、Remserial(GPL)もUnix PTYを使用して、必要な処理を実行できます。シリアルデータを「生の形式」でネットワークソケットに送信します。STTYに似た端末パラメータの設定は、ポートの作成時に行う必要があります。RFC2217に記載されているように、後で変更することはサポートされていないようです。事前にポート速度などを設定する必要があることを除いて、com0comのような仮想ヌルモデムを作成するために2つのレムリアルインスタンスを実行できるはずです。
Socat(またはGPL)は、Remserialの拡張バリアントのようなもので、PTYを他の何かにリダイレクトするための「PTY」メソッドを含み、Socatの別のインスタンスにすることができます。Unit tetsの場合、ファイルをPTYに直接catできるため、socatはremserialより優れている可能性があります。マンページのPTYの例を参照してください。パッチが存在するシリアルラインの設定を交渉するためのRFC2217のサポートを提供するために、「寄贈」の下に。
以前の回答で投稿されたリンクを使用して、仮想シリアルポートを使用するC ++で小さな例をコーディングしました。コードをGitHubにプッシュしました:https : //github.com/cymait/virtual-serial-port-example。
コードはかなり自明です。まず、。/ main masterを実行してマスタープロセスを作成すると、デバイスが使用しているstderrに出力されます。その後、。/ mainスレーブデバイスを呼び出します。ここで、deviceは最初のコマンドで出力されたデバイスです。
以上です。2つのプロセス間に双方向リンクがあります。
この例を使用すると、あらゆる種類のデータを送信してアプリケーションをテストし、正しく機能するかどうかを確認できます。
また、いつでもデバイスをシンボリックリンクできるため、テストするアプリケーションを再コンパイルする必要はありません。
私は3つのオプションを考えることができます:
RFC 2217は、あるシステムのクライアントがローカルプログラムへのシリアルポートをエミュレートし、実際にシリアルポートを持つ別のシステムのサーバーにデータと制御信号を透過的に送受信できるようにする、TCP / IP標準へのCOMポートをカバーしています。ここだ高レベルの概要は、。
あなたがすることはあなたのPCのシステムのクライアント側を実装するクライアントCOMポートドライバーを見つけるか実装することです-実際のシリアルポートのように見えますが実際にはすべてをサーバーに送っています。実際のスタンドアロンシリアルポートサーバーをサポートするDigi、Lantronixなどからこのドライバーを無料で入手できる場合があります。
次に、接続のサーバー側をローカルで別のプログラムに実装します。これにより、クライアントが接続し、必要に応じてデータと制御コマンドを発行できるようになります。
それはおそらく些細なことではありませんが、RFCはそこにあり、接続の片側または両側を実装するオープンソースプロジェクトを見つけることができるかもしれません。
または、Linuxのシリアルポートドライバーソースをすぐに利用できます。それを取り、ハードウェアの制御部分をすっきりさせて、1つのドライバーが単純なループバックとして2つの/ dev / ttySxポートを実行するようにします。次に、実際のプログラムをttyS2に接続し、シミュレータを他のttySxに接続します。
しかし、今する最も簡単なことは?2つのシリアルポートUSBデバイスに40ドルを費やして、それらを一緒に配線し(ヌルモデム)、実際には2つの実際のシリアルポートを持っています。1つはテストするプログラム用、もう1つはシミュレーター用です。
-アダム