dummy.php:
echo "\ntime 0:".round(microtime(true) * 1000); include 'PhpSerial.php'; echo "\ntime 1:".round(microtime(true) * 1000); `stty -F /dev/ttyUSB0 raw speed 9600 -crtscts cs8 -parenb -cstopb`; echo "\ntime 2:".round(microtime(true) * 1000); // Let's start the class $serial = new PhpSerial(); echo "\ntime 3:".round(microtime(true) * 1000); // 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("/dev/ttyUSB0"); echo "\ntime 4:".round(microtime(true) * 1000); // We can change the baud rate, parity, length, stop bits, flow control $serial->confBaudRate(9600); echo "\ntime 5:".round(microtime(true) * 1000); $serial->confParity("none"); echo "\ntime 6:".round(microtime(true) * 1000); $serial->confCharacterLength(8); echo "\ntime 7:".round(microtime(true) * 1000); $serial->confStopBits(1); echo "\ntime 8:".round(microtime(true) * 1000); $serial->confFlowControl("none"); echo "\ntime 9:".round(microtime(true) * 1000); // Then we need to open it $serial->deviceOpen(); // To write into echo "\ntime A:".round(microtime(true) * 1000); $serial->sendMessage("O(00,02,1)E");
測試:
$ time sudo php -n dummy.php ( -n 是不走php.ini的設定,因為我之前browscap.ini設定太肥會delay)
time 0:1418786501622
time 1:1418786501623
time 2:1418786501890
time 3:1418786501890
time 4:1418786501890
time 5:1418786502156
time 6:1418786502423
time 7:1418786502690
time 8:1418786502956
time 9:1418786503223
time A:1418786503223
time B:1418786504957 # 後面sleep了一秒,讓燈關掉
real 0m3.373s
user 0m0.007s
sys 0m0.003s
在 PHP-Serial API的底層,每叫一次function ( new PhpSerial()、$serial->deviceSet、$serial->confBaudRate )都會用stty去檢查一次,每次stty檢查都會在IO上delay 0.3秒,所以我們現在假設你的裝置都連結配置好,將多餘的設定和stty檢查拿掉
更改PhpSerial.php:
+++ b/PhpSerial.php @@ -32,22 +32,27 @@ class PhpSerial * @var bool */ public $autoFlush = true; + public $_check_stty = true; /** * Constructor. Perform some checks about the OS and setserial * * @return PhpSerial */ - public function PhpSerial() + public function PhpSerial($param) { + $this->_check_stty = (isset($param['check_stty']))? $param['check_stty'] : $this->_check setlocale(LC_ALL, "en_US"); $sysName = php_uname(); if (substr($sysName, 0, 5) === "Linux") { $this->_os = "linux"; + if (!$this->_check_stty) { + register_shutdown_function(array($this, "deviceClose")); + return false; + } @@ -86,9 +91,12 @@ class PhpSerial */ public function deviceSet($device) { + if (!$this->_check_stty) { + $this->_device = $device; + $this->_dState = SERIAL_DEVICE_SET; + return false; + }
修改dummy.php
echo "\ntime 0:".round(microtime(true) * 1000); include 'PhpSerial.php'; echo "\ntime 1:".round(microtime(true) * 1000); echo "\ntime 2:".round(microtime(true) * 1000); $serial = new PhpSerial(array('check_stty'=> false)); echo "\ntime 3:".round(microtime(true) * 1000); $serial->deviceSet("/dev/ttyUSB0"); echo "\ntime 4:".round(microtime(true) * 1000); $serial->deviceOpen(); echo "\ntime A:".round(microtime(true) * 1000); $serial->sendMessage("O(00,02,1)E");
測試:
$ time sudo php -n dummy.php
time 0:1418787683165
time 1:1418787683165
time 2:1418787683165
time 3:1418787683165
time 4:1418787683165
time A:1418787683166
time B:1418787684896 # 後面sleep了一秒,讓燈關掉
real 0m1.774s
user 0m0.000s
sys 0m0.007s
沒有留言:
張貼留言