用 PHP 寫 RS232 串列通訊程式
相信經常在翻 PHP 手冊的人應該都有察覺,PHP 不只是可以用來開發網頁程式而已,很多其他語言能完成的工作 PHP 也都做的到,例如透過 PHP 的 Direct IO Functions 就可以對 Serial port 溝通,而且可以在 Windows 下執行,一般在 Windows 要實做 com port 通訊程式,大多是透過像 VB/VC++/C++ Builder 這類程式所提供的元件來撰寫,不過用 PHP 就可以很快實做出一般的功能囉!
在開始之前要先讓 PHP 支援 dio 才行,5.1.0 版之後已經將 dio 移至 PECL 了,可以到 PHP 官網下載編譯好的 PECL,解壓縮後將裡面的 php_dio.dll 放到 PHP 目錄的 ext 底下,接著修改 php.ini 加入 extension=php_dio.dll 即可。
在 Windows 底下讀取 COM1 的例子:
<?php
exec('mode COM1: baud=19200 data=8 stop=1 parity=n');
$fd = dio_open('COM1:', O_RDWR);
while (1) {
$data = dio_read($fd, 1);
if ($data) {
echo $data;
}
}
dio_close($fd);
?>
寫法跟在 Linux 用 C 寫 serial 通訊程式差不多,其中 mode 是 Windows 命令列一個設定 serial port 組態的工具(類似 Linux 的 stty),可以打 mode /? 看詳細說明,設定好傳輸率等,接著用 dio_open 開啟裝置,然後就可以做存取的動作囉!
※ 2009/04/10 補充:
有不少人看了這篇之後,問我要怎麼用 PHP 讀取 GPS 資料。
在這邊要跟各位補充的是,如果您想要用瀏覽器在網頁執行 PHP,然後去讀取 GPS,這的確可以抓到資料,但其實是存在很多問題的,因為 Web 架構並不適合應用在這類有「持續連接」行為的地方,所以有可能發生 timeout、資源佔用、搶奪,嚴重的話會導致伺服器 crash。
但是如果一定要用 PHP 實作,建議應該是利用 command line 的方式執行,在背景專門負責抓 GPS 資料 ,並且將座標資料存入檔案或資料庫,然後網頁再去存取座標資料,如此一來便不會影響到 Web 運作。
大大 請教一下
exec('mode COM1: baud=19200 data=8 stop=1 parity=n');
這一行 是不是 產生一個輸入訊號
而
$fd = dio_open('COM1:', O_RDWR);
while (1) {
$data = dio_read($fd, 1);
if ($data) {
echo $data;
}
}
dio_close($fd);
這幾行就是 把它讀出來 對嗎?
請大大 指導一下.... 感謝感謝
第一行是使用 exec() 這個 PHP 函式執行 mode 外部指令,用來設定 com port 相關資訊,以範例來說是設定傳輸速率=19200、資料位元=8、停止位元=1、同位檢查=無,這要視設備而定,設定正確才能做存取動作。
再來就是利用迴圈每次讀取一個字元,如果有東西就顯示出來。當然這只是範例,實際上會依設備不同而有不同的存取方式。可以利用這篇所提到的工具來測試,確定如何和設備溝通再決定程式怎麼寫。
老大,我能將你的這篇文章一字不漏(包含這篇的網址,你的大名....)
放在我的Blog給我朋友參考嗎?
好文章阿... 學習消化中
本站文章皆採用CC授權,只要標示來源都是歡迎分享的。
板主您好,
請教一下,因為我所使用的PHP版本為較舊的v4.3.1,
是不是已經內建dio了?且也不用編輯php.ini?
還是需要怎麼做才會比較正確呢?謝謝指教!
August:
必須要 PHP 5 才有支援 DIO
版主您好:
請問一下,是否我在Freebsd中,使用PHP 5.1.6版就可以執行了呢?還是需要再download dio檔案及更改PHP.ini 內容呢?
Mickey:
還是需要下載 DIO(可能需自行編譯) 及更改 php.ini
版主:
.exec('mode COM1: baud=19200 data=8 stop=1 parity=n');
cannot open file COM1: with flags 2 and permissions 0:
想问一下,为什么我执行了第一句说我没有权限的?
顺便想知道那里可以打开串口。。
我也是出現這樣的錯誤(沒有權限),難道VISTA還有哪裡要設定嗎??
Warning: dio_open() [function.dio-open]: cannot open file COM4 with flags 2 and permissions 0: Permission denied in C:\Apache2.2\htdocs\DosDiosas\comm.php on line 6
我是出現在dio_open這一行...