How do I control a serial port using PHP?
PHP (PHP HyperText Preprocessor) is a server side scripting language popular with website developers. Typically PHP is used to generate web pages by interrogating a database and files. However PHP can also be used to control and communicate with other devices.
This article explains how to configure PHP in order to send and receive data over a serial port on a unix system or a windows system.
- PHP installed on your computer
- An installed Brainboxes Serial port product
Steps In Brief
- Install PHP Direct IO extension
- Configure PHP to use the extension
- Use PHP file provided in the downloads
- Open terminal program at other end of serial connection
- Configure PHP file with correct local serial port settings
Install PHP Direct IO
PHP by default does not offer good COM port support however a PHP extension called Direct IO does offers low level access to IO. We will use this extension for serial port communication.
On unix system install the extension using PECL, open a terminal and type:
sudo pecl install dio-0.0.7
On windows download the latest php direct io extension dll from: http://pecl.php.net/package/dio. The dll file should be copied into your php_extension folder (often located in
Configure PHP to use the extension
Next the php.ini file needs to be updated to tell it to use the extension. To the bottom of the php.ini file add the following.
Unix: commands vary, on mac for example:
sudo apachectl restart
Windows: restart IIS webserver, or WAMP server
Use PHP file provided in the downloads
Download the file about and place it in your web-servers root directory. Navigate to the file the a web browser to confirm that an error is not produced which tells you to install PHP Direct IO.
Open terminal program at other end of serial connection
In order to test sending and receiving serial data in PHP, the other end of the serial port should be open. On a windows system we recommend using Putty and on Mac OSX CoolTerm (see this FAQ for more details) to configure a serial for for transmitting and recieving data. We also recommend opening the other side of the serial connection in the terminal initially to confirm that data is definitely able to be sent and received across the connection.
Configure PHP file with correct local serial port settings
The sample script has some settings to be configured at the top, most importantly the port name.
Windows the port name should be 'comX:' (X being the port number assigned name must be lower case and a colon at the end) this can be found by opening Device Manager.
Unix systems the port name is '/dev/cu.usbserial-XXXXXXXXX' where 'X' is a randomly assigned id. To find all the names of Brainboxes serial ports installed on UNIX type
ls /dev/cu.usbserial* into the terminal.
In a Web Browser open the file, the other end of the serial port should show 'HELLO WORLD!'. Then type into the terminal on the other end of the connection, this will be echoed back onto the web browser window.
Important note: PHP Direct IO does not currently implement a timeout on reads and is blocking. What this means is that if there is no data present when the read method is called then PHP will block (halt) until data is received or the PHP execution time is reached.
PHP Direct IO manual - http://www.php.net/manual/en/book.dio.php
This FAQ Applies to the following Brainboxes Product Ranges:
- BL - Bluetooth Serial Adapter
- CC - PCI Serial Cards
- ES - Ethernet to Serial
- IS - IntaShield uPCI Serial Cards
- IX - IntaShield PCI Express Serial Cards
- PM - Serial PC Card (PCMCIA)
- PX - PCI Express Serial Cards
- UC - uPCI Serial Cards
- UP - uPCI Powered Serial Cards
- US - USB to Serial
- VX - Serial ExpressCard
- XC - Serial PCIe ExpressCard