6

我正在尝试将以下小型 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

目前,我从 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;

}

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

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

任何帮助将不胜感激!我基本上已经放弃尝试了。如果 QBASIC 可以完美地做到这一点,那么我们必须能够使用 PHP 来完成这项工作!

4

3 回答 3

9

您可能想研究Rémy Sanchez 的PHP Serial。这里有一篇关于它的文章:

用 PHP 控制串口

还可以查看jared 在PHP 站点上的dctkc dot com提供的这个示例:

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

于 2010-07-12T08:54:00.953 回答
5

可以肯定的是,默认情况下 PHP 无法访问硬件端口。它可以访问网络资源、文件资源,但在硬件和您要读取的内容之间没有某种传输,看不到这个工作。

但是,您可能可以加载一个特定于平台的扩展来启用此功能 - 只是调查。

e:是的,有 - 检查这个扩展,可能是你所追求的。没有这样的东西,它就是行不通的。

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

于 2010-07-12T08:50:18.130 回答
3

如果您在 Linux 或其他类似 UN X 的系统(例如 Mac OS X)上,请尝试fopen('/dev/ttyS0')- 在 UN X 中,一切都是文件,甚至是串行端口。有关找出哪个端口映射到哪个“文件”的一些提示,请参阅此内容。

于 2010-07-12T09:04:11.523 回答