10

Windows で RS232 シリアル COM ポートと通信する方法を探しています。ネット上で 2 つのソリューションを見つけました。1 つは完全に無料ではない (機能に意図的な遅延を導入する) もので、もう 1 つは Windows での機能が制限されているものです。後者は、Windows の COM ポートへの書き込みのみが可能で、読み取りはできません。

最初のソリューションのコードは.dllにコンパイルされているため見ることができません(意味があります。そうしないと、遅延を編集して購入することはできません...)、2番目のソリューションは fopen() のみを使用しているようですストリームに対して行うのと同じように、ポートを開き、後で fwrite() を使用して書き込みます。しかし、明らかにそれを恐れても何も返されません。

最初のソリューションと同じように可能であることはわかっていますが、Apache で php5module の代わりに php-cgi モジュールを使用する必要があります。

何か案は?

4

8 に答える 8

14

上記のすべての解決策は、非効率的であるか、作業が多すぎます。

PHP-DIO ライブラリ(dio_fcntl、dio_open、dio_read、dio_write、dio_seek、...) を使用できます。PHP マニュアルの DIO のエントリにもあります。

この PECL パッケージはデフォルトでは利用できません。5.2.6 以降の PHP 5.2.x を使用している場合に Windows 用に入手するには、ZIP の一部としてダウンロードできます。

これらのリンクはどちらもhttp://www.deveblog.com/index.php/download-pecl-extensions-for-windows/にあります。

これは Linux からのビルドです。入手して phpize/configure/make/make install を実行してください。

Apache セッションで使用する必要があるかどうかはわかりませんが、使用してください。

于 2011-08-28T17:28:56.813 に答える
6

DOS のようなコマンドを使用して、COM ポートをセットアップする必要があります。

たとえば、次の行は、php を介してコマンドを実行します。

$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on`;

結果を表示するには、次を使用できます。

echo "$output"; 

リソース ID を作成します。

$fp = fopen('COM1', 'r+');

if (!$fp)
{
      echo "Port not accessible";
}
else
{
     echo "Port COM1 opened successfully";
}

ポートへの書き込み:

$writtenBytes = fputs($fp, "Hello");

echo"Bytes written to port: $writtenBytes";

ポートから読み取る:

$buffer = fgets($fp);

echo "Read from buffer: $buffer";

誰かが私の問題を解決してくれるかもしれませんfgets。の場合は正確に 1 分間TO=on、または の場合は永久にそこにスタックしますTO=offMODE COM" " オプションのように見えるので、DOS の専門家が助けてくれるかもしれません。

おそらく の代わりにfgets、 を使用する必要があります。これはfgetcfgetsまでキャプチャするためです。 newlinewhilefgetcは単一の文字をキャプチャします。新しい行が検出されない場合は、新しい行が見つかるまで、またはバッファーがフラッシュされるまでブロックされる可能性があります。1 分間の遅延は、ウィンドウが一定間隔でバッファをフラッシュしている可能性があります。

于 2009-07-02T13:14:14.150 に答える
4

これに取り組む最も簡単な方法は、別の言語 (C++ など) でプログラムを作成し、それを .php スクリプトから実行することsystem()です。C++ で Comm I/O を実行するのは簡単です。

これは、実行可能ファイルをphpなどで実行できるようにサーバーを構成するのに十分なアクセス権があることを前提としています.

于 2009-03-09T20:50:55.493 に答える
3

別の可能な方法は、w32api_register_function()またはffiのようなものを介して Win32 API を使用し、シリアル通信呼び出しを使用して Windows で動作させることです。

于 2009-03-09T21:02:54.670 に答える
3

私は同じ問題を抱えており、Arduino開発者に人気のあるこのソリューション「serproxy」に出くわしたとき、すでに独自のphp拡張機能を作成することを検討していました(多くの場所、つまりhttp://www.lspace.nildram.co. uk/freeware.html ) は、シリアル ポートとの間で tcp スタックをセットアップし、php ソケット関数を使用して通信できるようにしました。

于 2010-11-08T18:50:05.913 に答える
1

もう1つのオプションは、WindowsでActiveXを介してオブジェクトを使用することです。Windows上のCOMには、ほとんどが商用のシリアルオブジェクトがいくつかあります。.Netベースのオブジェクトを公開し、COMで使用するために登録することもできます。もちろん、これは、シリアルインターフェイスが必要になるため、COMコントロールを登録するためのコントロールがサーバー上にあることを前提としています。

もう1つの問題は、これがWeb経由で使用される場合のリソース競合です。たとえば、これがシリアルプリンタの場合、直接通信ではプリントキューマネージャが最適なオプションです。

于 2009-04-07T16:53:55.160 に答える
1

com ポートを使用して sms を処理する場合は、Rémy Sanchez による最も有名な php シリアル通信クラスgoogle サンプル コードを次に示します。ここにそのトピックを含むスレッドがあります。

于 2014-01-04T16:35:10.710 に答える