How to Read RS232 Serial Port in PHP like this QBasic Program

CJ_ picture CJ_ · Jul 12, 2010 · Viewed 34.5k times · Source

I'm trying to port the following small QBASIC program (which works 100%) to PHP:

OPEN "com1:2400,n,8,1,DS," FOR RANDOM AS #3
OPEN "data.dat" FOR OUTPUT AS #2
REM read 17 chars from the port
scale$ = INPUT$(17, #3)
PRINT scale$
WRITE #2, scale$
CLOSE #2
CLOSE #3
SYSTEM

Currently I'm calling it in its compiled (exe) form from PHP (on WAMP5) but I'd like to get rid of the QBASIC and call it directly from PHP.

I wrote this PHP function but it just hangs at the fgets() line:

function read_port($port='COM1:', $length=17, $setmode=TRUE, $simulate='') {
    if ($simulate){
        $buffer = '"'.strval(rand(1000, 2000));
        return $buffer;
    }
    if ($setmode){
        shell_exec('mode com1: baud=2400 parity=n data=8 stop=1 to=on xon=off odsr=on octs=on dtr=on rts=on idsr=on');
    }
    $fp = fopen($port, "rb+");
    if (!$fp) {
        file_put_contents('debug1.log','COM1: could not open'."\n",FILE_APPEND);
    } else {
        $buffer = fgets($fp, $length); // <-- IT JUST HANGS HERE DOING NOTHING !
        fclose ($fp);
    }
    return $buffer;

}

I'm using this PHP line to call the above function:

$res = read_port('COM1:', 17, TRUE, SIMULATE_SCALE);

Any help will be creatly appreciated! I've basically given up trying. If QBASIC can do it perfectly then we must be able to make this work with PHP!

Answer

Mike picture Mike · Jul 12, 2010

You might want to look into PHP Serial by Rémy Sanchez. There's an article about it here:

Controlling the Serial Port with PHP

Also have a look at this example provided by jared at dctkc dot com on the PHP site:

http://php.net/manual/en/function.fopen.php#20935