如何在PHP中读取RS232串口,就像这个QBasic程序一样

CJ_*_*CJ_ 6 php hardware-interface qbasic

我正在尝试将以下小型QBASIC程序(可以100%工作)移植到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
Run Code Online (Sandbox Code Playgroud)

目前我从PHP(在WAMP5上)以编译(exe)形式调用它,但我想摆脱QBASIC并直接从PHP调用它.

我写了这个PHP函数,但它只是挂在fgets()行:

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;
Run Code Online (Sandbox Code Playgroud)

}

我正在使用这个PHP行来调用上面的函数:

$res = read_port('COM1:', 17, TRUE, SIMULATE_SCALE);
Run Code Online (Sandbox Code Playgroud)

任何帮助都将受到赞赏!我基本上放弃了尝试.如果QBASIC可以完美地完成它,那么我们必须能够使用PHP来完成这项工作!

Mik*_*ike 10

你可能想看一下RémySanchez的PHP Serial.这里有一篇关于它的文章:

用PHP控制串口

另请参阅PHP站点上dctkc dot comjared提供的示例:

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

  • 感谢您的回答,但是RémySanchez的PHP Serial只能编写串口但在Windows上运行时无法读取.但是Linux支持读写. (2认同)

dmp*_*dmp 5

非常确定默认情况下PHP无法访问硬件端口.它可以访问网络资源,文件资源,但是如果硬件和您尝试阅读的内容之间没有某种传输,则无法看到这种情况.

但是,您可以加载一个特定于平台的扩展程序,这将启用此功能 - 只需调查即可.

e:是的,有 - 检查这个扩展,可能是你想要的.没有这样的东西,它就不会起作用.

"此扩展允许直接访问并行和串行(rs232)端口,在WIN9x/NT/2000/XP下的DLL inpout32.dll中进行读取和写入任何组件.具体的应用程序示例:完整的自动化与Web界面和php,任何性质的连接硬件与端口一样简单或复杂.一个简单但非常实用的想法...扩展和源代码是用Delphi 6编译的PHP5.0到5.1.2,包括源代码和示例."