« C 語言中 printf 的問題(續) 徹底移除新倉頡輸入法 »

十月2

用 PHP 寫 RS232 串列通訊程式

tags , | 3,510 views


相信經常在翻 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 開啟裝置,然後就可以做存取的動作囉!

Trackback:

9 Comments on “用 PHP 寫 RS232 串列通訊程式”

  1. 過路的貓 Says:

    大大 請教一下

    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);

    這幾行就是 把它讀出來 對嗎?

    請大大 指導一下…. 感謝感謝

  2. http://blog.linym.net/
    lym520 Says:

    第一行是使用 exec() 這個 PHP 函式執行 mode 外部指令,用來設定 com port 相關資訊,以範例來說是設定傳輸速率=19200、資料位元=8、停止位元=1、同位檢查=無,這要視設備而定,設定正確才能做存取動作。

    再來就是利用迴圈每次讀取一個字元,如果有東西就顯示出來。當然這只是範例,實際上會依設備不同而有不同的存取方式。可以利用這篇所提到的工具來測試,確定如何和設備溝通再決定程式怎麼寫。

  3. 小靜 Says:

    老大,我能將你的這篇文章一字不漏(包含這篇的網址,你的大名….)
    放在我的Blog給我朋友參考嗎?
    好文章阿… 學習消化中

  4. http://blog.linym.net/
    lym520 Says:

    本站文章皆採用CC授權,只要標示來源都是歡迎分享的。

  5. August Says:

    板主您好,
    請教一下,因為我所使用的PHP版本為較舊的v4.3.1,
    是不是已經內建dio了?且也不用編輯php.ini?
    還是需要怎麼做才會比較正確呢?謝謝指教!

  6. http://blog.linym.net/
    lym520 Says:

    August:
    必須要 PHP 5 才有支援 DIO

  7. Mickey Says:

    版主您好:
    請問一下,是否我在Freebsd中,使用PHP 5.1.6版就可以執行了呢?還是需要再download dio檔案及更改PHP.ini 內容呢?

  8. http://blog.linym.net/
    lym520 Says:

    Mickey:
    還是需要下載 DIO(可能需自行編譯) 及更改 php.ini

  9. http://no
    lang Says:

    版主:
    .exec(’mode COM1: baud=19200 data=8 stop=1 parity=n’);
    cannot open file COM1: with flags 2 and permissions 0:
    想问一下,为什么我执行了第一句说我没有权限的?
    顺便想知道那里可以打开串口。。

Leave a Reply