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

6

我正在尝试将以下小型QBASIC程序(已经能够正常运行)移植到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使其工作!


有解决这个问题的办法吗? - StackOverflowNewbie
3个回答

9

2
谢谢您的回答,但是Rémy Sanchez的PHP Serial在Windows上运行时只能写入串口而不能读取。不过,在Linux上支持读写。 - CJ_
1
@CJ_:PHP串行页面上有这样一条注释:“如果您是Windows用户,请尝试使用serproxy通过网络访问串行端口”。serproxy在PHP网站上提供了示例。该示例显示了写入,但Rémy Sanchez的评论表明它也可以用于读取。如果不行,您可以尝试danp的建议,并借助Google翻译 - Mike

5
我很确定PHP默认没有访问硬件端口的权限。它可以访问网络资源、文件资源,但如果没有硬件和你尝试读取的内容之间的某种传输方式,这是行不通的。
不过,可能会有一些特定于平台的扩展可以加载,从而实现此功能 - 正在调查中。
e: 是的,有一个 - 检查这个扩展,可能是你想要的。如果没有像这样的东西,它就行不通。
“这个扩展允许直接访问并行和串行(RS232)端口,通过DLL inpout32.dll在WIN9x/NT/2000/XP下进行读写。一个具体应用的例子:使用web界面和php完全自动化房屋,连接任何性质的硬件与端口,如简单或复杂的装配。一个简单但相当实用的想法......扩展和源代码编译于Delphi 6为PHP5.0至5.1.2,包括源代码和示例。”

谢谢您的回答,但我不会法语。下载用法语怎么说?是“téléchargement”吗? - CJ_
从非常快速的概述来看,danp建议的扩展看起来很容易使用。这里是一个Google翻译链接。 - Mike
@Mike和其他人:只是想让你们知道,我还没有找到可行的解决方案,但一直在使用Google翻译;非常方便。我的问题实际上变得更糟了。我切换到Wampserver 2.1后,我的应用程序现在只能工作几个小时,然后会挂起系统。即使重新启动也无法解决这个问题,我的客户必须切换到“过磅站覆盖”模式。 - CJ_

3

如果您使用的是Linux或其他类Unix系统(例如Mac OS X),请尝试fopen('/dev/ttyS0') - 在Unix中,所有内容都是文件,甚至包括串行端口。 点击此处获取一些有关查找哪个端口映射到哪个“文件”的提示。


谢谢,但我的客户使用的是Windows XP操作系统。 - CJ_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接