Windows上のPHPを使用したシリアルコミュニケーション
-
06-07-2019 - |
質問
WindowsのRS232シリアルCOMポートと通信する方法を探しています。ネット上で2つの解決策を見つけました。 1つは完全に無料ではありません(意図的に導入します)関数の遅延)および別の(Windowsの機能が制限されています)。後者は、WindowsではCOMポートへの書き込みのみが可能で、読み取りはできません。
最初のソリューションのコードは.dllにコンパイルされているので見当たりません(理にかなっています。そうでなければ、遅延を編集するだけで購入することはできません...)。 fopen()でポートを開き、後で書き込みのためにfwrite()します。これは、ストリームに対して行うのと同じです。しかし、どうやらそれは何も返しません。
Apacheにphp5moduleの代わりにphp-cgiモジュールを使用する必要がありますが、最初の解決策でそれが可能であったことはわかっています。
アイデアはありますか
解決
上記の解決策はすべて、非効率であるか、作業が多すぎます。
PHP-DIOライブラリ(dio_fcntl、dio_open、 dio_read、dio_write、dio_seek、...)。また、 DIOのPHPマニュアルのエントリにもあります:
このPECLパッケージは、デフォルトでは使用できません。 PHP 5.2.xが5.2.6より大きい場合にWindows用に入手するには、ZIPの一部としてダウンロードできます。
これらのリンクは両方とも http://で見つかりました。 www.deveblog.com/index.php/download-pecl-extensions-for-windows/
Linuxからのビルド、入手してphpize / configure / makeを実行するだけです/ make install thing。
Apacheセッションで使用する必要があるかどうかはわかりませんが、使用してください。
他のヒント
これに取り組む最も簡単な方法は、別の言語(C ++など)でプログラムを記述し、 system()
を使用してphpスクリプトから実行することです。 C ++でComm I / Oを実行するのは簡単です。
これは、実行ファイルをphpなどで実行できるようにサーバーを設定するための十分なアクセス権があることを前提としています
別の可能な方法は、 w32api_register_function()
などの方法でWin32 APIを使用することです。 または ffi を使用し、シリアル通信呼び出しにより、Windowsで動作するようになります。
同じ問題があり、Arduino開発者に人気のあるこのソリューションに出くわしたときに、独自のphp拡張モジュールを書くことを既に検討していました-'serproxy'(多くの場所で見つかりました。つまり、 http://www.lspace.nildram.co.uk/freeware.html )は、TCPスタックをセットアップします。シリアルポートを使用して、phpソケット関数を使用して通信できるようにしました。
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
の問題を解決してくれるかもしれません。 TO = on
の場合はちょうど1分間スタックし、 TO = off
の場合は永遠にスタックします。 " MODE COM
"のようです。 DOSの専門家が支援できるかもしれません。
おそらく fgets
の代わりに、 fgets
を使用する必要があります。これは、 fgets
が newline
fgetc
は単一の文字をキャプチャします。新しい行が検出されない場合、行が存在するか、バッファがフラッシュされるまでブロックされます。 1分間の遅延は、一定の間隔でウィンドウがバッファをフラッシュする場合があります。
別のオプションは、WindowsでActiveXを介してオブジェクトを使用することです。 Windows上のCOMには、主に商用のシリアルオブジェクトがいくつかあります。 .Netベースのオブジェクトを公開し、COMで使用するために登録することもできます。もちろん、これは、シリアルインターフェイスが必要になるため、COMコントロールを登録するためにサーバーを制御できることを前提としています。
もう1つの問題は、Web経由で使用する場合のリソースの競合です。たとえば、これがシリアルプリンター用の場合、直接通信よりも印刷キューマネージャーが最適なオプションになります。
comポートを使用してsmsを処理する場合は、最も有名な Ré my Sanchez による googleサンプルコード。 スレッドがありますそのトピックが含まれています。
>