【问题标题】:How to Read RS232 Serial Port in PHP like this QBasic Program如何像这个 QBasic 程序一样在 PHP 中读取 RS232 串口
【发布时间】:2010-07-12 08:47:17
【问题描述】:

我正在尝试将以下小型 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 来实现它!

【问题讨论】:

  • 这个问题有什么解决办法吗?

标签: php hardware-interface qbasic


【解决方案1】:

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

Controlling the Serial Port with PHP

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

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

【讨论】:

  • 感谢您的回答,但是 Rémy Sanchez 的 PHP Serial 在 Windows 上运行时只能写串口而不能读。 Linux 上支持读写。
  • @CJ_:PHP Serial 页面上有这样的注释:“如果你是 windows 用户,请尝试使用 serproxy 通过网络访问串口”。在 PHP 站点上给出的示例中使用了 serproxy。该示例显示了写作,但 Rémy Sanchez 的评论表明它也可以用于阅读。如果没有,你可以在Google Translate的帮助下尝试danp的建议。
【解决方案2】:

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

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

e:是的,有 - 检查this extension,可能就是你想要的。没有这样的东西,它就是行不通的。

"此扩展允许直接 访问并行和串行(rs232) 通过 DLL 进行读写端口 WIN9x/NT/2000/XP下的inpout32.dll 对于任何装配。一个例子 具体应用: 完整的房子 使用 Web 界面和 php 实现自动化, 任何性质的连接硬件 端口喜欢组件简单或 复杂。一个想法简单但相当 实用...扩展和来源是 用 Delphi 6 for PHP5.0 编译到 5.1.2,包括来源和示例。”

【讨论】:

  • 感谢您的回答 danp,但我的法语不存在。什么是法语下载?电话收费?
  • 从一个非常快速的概述来看,danp 建议的扩展看起来很容易使用。这是Google Translate 链接。
  • @Mike 和其他人:只是让你知道,我还没有找到可行的解决方案,但从那以后一直在使用谷歌翻译;非常便利。我的问题实际上变得更糟了。我切换到 Wampserver 2.1,我的应用程序现在只能运行几个小时然后挂起系统。即使重新启动也不能解决问题,我的客户必须切换到“地磅覆盖”模式。
【解决方案3】:

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

【讨论】:

  • 谢谢,但我的客户端使用的是 Windows XP
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
相关资源
最近更新 更多