PHPでシリアル通信

概要

PHPからシリアル通信はできるのか調べてみました。実はUSB接続の学習リモコンPC-OP-RS1が昔から欲しかったのですよね。Rubyからは楽にできるのは知っていたのですが、PHPってこの手の操作ないよなって思っていました。

PHP Extension(Windows)の場合

http://thebyteworks.com/phpserial/index.html

extensionとして実装されています。Windows上からヨーロッパで使われているWS2300って気象関係の機材を制御するプロジェクトの一部みたいですね。

Windowsのみってのがちょっとひっかかるのとextensionだと環境に依存するのでちょっと保留

Serproxy(Windows+Linux)の場合

http://www.lspace.nildram.co.uk/freeware.html

ターゲットマシン上にTCP/IPとSerialのproxyサーバーを立てます。PHPからはソケット接続で制御します。一台のターゲットマシンにTCP/IPから制御できるってのはメリットだと思いますが、同じマシン上の場合にはちょっと面倒ですね。

PHP Serial(Windows+Linux)の場合

http://www.phpclasses.org/browse/package/3679.html

調べながらこれを自分で組むのかなと思っていた実装。。。fopenでシリアルポートを自分で制御します。よくできているのがWindowsLinuxでシリアルの速度とかの設定方法が違うので、その辺をサポートしているところかな?

<?php
include "php_serial.class.php";

// Let's start the class
$serial = new phpSerial;

// First we must specify the device. This works on both linux and windows (if
// your linux serial device is /dev/ttyS0 for COM1, etc)
$serial->deviceSet("COM1");

// Then we need to open it
$serial->deviceOpen();

// To write into
$serial->sendMessage("Hello !");

// Or to read from
$read = $serial->readPort();

// If you want to change the configuration, the device must be closed
$serial->deviceClose();

// We can change the baud rate
$serial->confBaudRate(2400);

// etc...

本家ライブラリは

http://www.phpclasses.org/browse/file/17926.html

こんな感じです。結構きれいに書いてあるかな? サンプルはなぜか登録しないとダウンロードできなかったので、ここにあげておきます。ドキュメントとかはアーカイブに含まれて居ないので本体だけダウンロードすれば利用できます。

ソースをボーっとのぞいているとWindowsだと読み込みに対応していない?

<?php
elseif ($this->_os === "windows")
{
	/* Do nohting : not implented yet */
}

trigger_error("Reading serial port is not implemented for Windows", E_USER_WARNING);
return false;

いろいろ調べてみるとO_NONBLOCKオプションをつけないとだめっぽいですね(未検証)

<?php
$this->_dHandle = @fopen($this->_device, $mode);

やっぱりそうですね。

<?php
if ($this->_os === "linux")
{
	$this->_dHandle = @fopen($this->_device, $mode);
}
elseif ($this->_os === "windows")
{
	$this->_dHandle = @fopen($this->_device, O_NONBLOCK, $mode);
}

こんな感じにして、読み出し部分つけてあげれば読み込めそう(未検証)。。。これ以上はシリアルポートの機材がないと確認が難しいのでここまでとします。

感想

総合的に見てPHPは制御向きの言語じゃないので、大変ですね。素直にPerlRubyを使った方が楽できそうです。