php5.6 如何使用dio?
我的php環境是php5.6我要用到串口,請問如何實現,我應該安裝哪些東西?
PHP串口通信(serial port communication)可以使用PHP類php_serial.class.php.
比如在樹莓派(Raspbian Linux)上用PHP進行物聯網編程時可能需要操作串口.
https://www.phpclasses.org/package/3679-PHP-Communicate-with-a-serial-port.html
https://www.phpclasses.org/browse/file/17926.html
- Easy port configuration
- Works on both Linux and Windows
- Read/write for Linux
- Write only for Windows
該類用PHP函數fopen/fread/fwrite/fclose/stream以及系統命令stty(Linux)和mode(Windows)配置和訪問串口,不需要用題主提到的dio擴展.
stty - change and print terminal line settings (stty: set tty)
mode - 配置系統設備
示常式序:
&deviceSet(/dev/ttyUSB0);
// 串口通信參數設置 9600-8-N-1 (no flow control)
// stty -F /dev/ttyUSB0 9600 -parenb cs8 -cstopb clocal -crtscts -ixon -ixoff
$serial-&>confBaudRate(9600); // 波特率
$serial-&>confParity(none); // 奇偶校驗 -parenb (符號-表示OFF關閉)
$serial-&>confCharacterLength(8); // 字元長度 cs8
$serial-&>confStopBits(1); // 停止位 -cstopb
$serial-&>confFlowControl(none); // 流量控制 clocal -crtscts -ixon -ixoff
$serial-&>deviceOpen();
$serial-&>sendMessage("foobar
");
echo $serial-&>readPort(); // 測試時把串口設備調成自發自收,這時輸出foobar
var_dump($serial);
$serial-&>deviceClose();
?&>
foobar
object(phpSerial)#1 (7) {
["_device"]=&>
string(12) "/dev/ttyUSB0"
["_windevice"]=&>
NULL
["_dHandle"]=&>
resource(27) of type (stream)
["_dState"]=&>
int(2)
["_buffer"]=&>
string(0) ""
["_os"]=&>
string(5) "linux"
["autoflush"]=&>
bool(true)
}
DIO,`Direct I/O functions`,是一套PHP擴展,讀取IO設備的。它是依賴 C 的 fread 和 fopen,所以不需要裝什麼系統擴展
我用DIO讀過串口rs232的數據,非常簡單。它的數據流是這樣的:
外設 =&> 串口 (USB)=&> 驅動 =&> (C語言庫) =&> DIO擴展 =&> PHP
這裡的外設可以是樹莓派、RFID讀卡器等任意設備,可以看到,需要安裝的僅僅兩個
- 串口轉USB驅動,這個在你找到對應usb廠家的驅動安裝即可;
- DIO擴展;
DIO如何安裝
- 在 pecl 搜索 dio,第一個就是,下載對應系統最新版本(跟驅動版本沒有關係);
- phpize,php-config,make,make install 一套流程走下來;
- OK!
如何讀取
php的讀取也非常簡單,要相信前人的智慧,github的項目比較多不是特別好辨認,我一般是上packagist搜索,看星星和下載量。
我用的是mdlayher/serial,不過composer國內支持不是很好,特附上github鏈接;
PHP class utilizing Direct IO to interact with a RS232 serial port
是不是相當的直觀,下面是我的一段讀取代碼
試過幾個庫,效果都不是很好,要麼是漏數據,要麼是阻塞的,這個是我嘗試後最好用的一個& 9600,
"bits" =&> 8,
"stop" =&> 1,
"parity" =&> 0,
);
$serial-&>set_options($options);
while(1) {
$id = $serial-&>read(24);
// 去掉第一位,標示ACK,ascii碼值為6
$val = 6;
for($i=1 ; $i&
推薦閱讀:
※遊戲伺服器 php框架選擇?
※如何看待 swoole 作者最近修改開源協議?
※虛驚一場?PHPMailer漏洞雞肋無比
※如何看待Yii框架創始人Qiang Xue轉投Go語言?
※學習PHP,然後學習C, 深入Linux的, 如果想往底層發展, 應該是如何的一個學習過程?