【问题标题】:Serial comm with PHP on Windows在 Windows 上使用 PHP 进行串行通信
【发布时间】:2009-03-09 20:45:05
【问题描述】:

我正在寻找一种与 Windows 上的 RS232 串行 COM 端口通信的方法。我在网上找到了 2 个解决方案,one 不是完全免费的(在功能上引入了故意延迟)和another 在 Windows 上的功能有限。后者只能写入 Windows 上的 COM 端口,不能读取。

我看不到第一个解决方案的代码,因为它被编译成一个 .dll (有道理,否则人们只能编辑延迟而不购买它......),第二个似乎只使用fopen() 打开端口,然后 fwrite() 对其进行写入,就像对流所做的那样。但显然,对它的恐惧没有任何回报。

我知道第一个解决方案是有可能的,尽管它确实需要 Apache 使用 php-cgi 模块而不是 php5module。

有什么想法吗?

【问题讨论】:

  • 你确定 fread() 什么都不返回吗?在 Windows 上,COM 端口只是特别命名的文件 IIRC。也许你需要设置端口参数,如奇偶校验、波特率等,这可能通过 PHP 是不可能的?

标签: php serial-port communication


【解决方案1】:

上述每个解决方案要么效率低下,要么工作量太大。

您可以只使用PHP-DIO library(dio_fcntl、dio_open、dio_read、dio_write、dio_seek,...)。也在the PHP manual's entry for DIO:

默认情况下,此 PECL 包不可用。如果您的 PHP 5.2.x 大于 5.2.6,要在 Windows 上获取它,您可以将其作为 ZIP 的一部分下载:

这两个链接都在http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/中找到

Here is the build from Linux,只需获取它并执行 phpize/configure/make/make 安装即可。

我不知道它是否应该在 Apache 会话中使用,但还是试试吧。

【讨论】:

  • 天哪,当我几年前问这个问题时,你在哪里!接受这个答案。
【解决方案2】:

您需要使用类似 DOS 的命令设置 com 端口。

例如下面一行通过php执行命令:

$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on`;

要显示您可以使用的结果:

echo "$output"; 

创建资源id:

$fp = fopen('COM1', 'r+');

if (!$fp)
{
      echo "Port not accessible";
}
else
{
     echo "Port COM1 opened successfully";
}

写入端口:

$writtenBytes = fputs($fp, "Hello");

echo"Bytes written to port: $writtenBytes";

从端口读取:

$buffer = fgets($fp);

echo "Read from buffer: $buffer";

也许有人可以帮助我解决fgets 的问题。如果TO=on,它会在那里堆叠一分钟,如果TO=off,它会永远堆叠在那里。这似乎是一个“MODE COM”选项,所以也许 DOS 专家可以提供帮助。

也许应该使用fgetc 而不是fgets,因为fgets 捕获到newline,而fgetc 捕获单个字符。如果没有遇到新行,它可能会阻塞,直到有一个或直到缓冲区被刷新。一分钟的延迟可能是窗口每隔一段时间刷新其缓冲区。

【讨论】:

    【解决方案3】:

    解决此问题的最简单方法是用另一种语言(例如 C++)编写程序,然后使用 system() 从您的 php 脚本中执行它。用 C++ 做 Comm I/O 很简单。

    这假设您对服务器有足够的访问权限来配置它以允许可执行文件由 php 等运行。

    【讨论】:

    • 我建议您将 comm 程序开发为 PHP 库,以便它直接与您的 PHP 代码集成。使用 system() 调用外部可执行文件是次优解决方案。
    • 同意,但对我来说,这不再属于“最简单的方式”,而是成为“最好的方式”。 :-)
    【解决方案4】:

    另一种可能的方法是通过w32api_register_function()ffi 之类的方式使用Win32 API,然后使用serial communications calls 使其在Windows 下工作。

    【讨论】:

      【解决方案5】:

      当我遇到这个在 Arduino 开发人员中很流行的解决方案时,我遇到了同样的问题并且已经考虑编写自己的 php 扩展 - 'serproxy'(在很多地方都找到了它,即http://www.lspace.nildram.co.uk/freeware.html)设置了一个 tcp 堆栈到/从串行端口,并允许我使用 php 套接字函数与之通信。

      【讨论】:

        【解决方案6】:

        另一种选择是通过 Windows 上的 ActiveX 使用对象。 Windows 上有几个用于 COM 的商业串行对象,主要是商业串行对象。您还可以公开基于 .Net 的对象并将其注册以供 COM 使用。当然,这假定您在服务器上拥有注册 COM 控件的控制权,因为您需要一个串行接口。

        如果要通过 Web 使用,另一个问题是资源争用。例如,如果这是用于串行打印机,那么打印队列管理器将是您直接通信的最佳选择。

        【讨论】:

          【解决方案7】:

          如果您想使用 com 端口处理短信,那么这里是最著名的 php serial communication class by Rémy Sanchezgoogle sample codeHere is a thread 包含该主题。

          【讨论】:

          • 请注意,link-only answers are discouraged,SO 答案应该是搜索解决方案的终点(与另一个中途停留的参考文献相比,参考文献往往会随着时间的推移变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
          【解决方案8】:

          我使用了 David Refoua 和 Giorgos Pap 的解决方案,并进行了一些修改以连接 Arduino UNO。在 PC 端,我有一个 AJAX 来接收来自 Arduino 的测量结果并以表格形式显示它们。现在我正在尝试以编程方式更新 COM 端口(在本例中为 COM3),

          <?php
          $output = exec("mode COM2: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on dtr=off odsr=off octs=off rts=on idsr=off");
          $fp = fopen("COM2", "r+");
          if (!$fp)
          {
            exit("Unable to establish a connection");
          }
          // RX form PC**************
          $t = $_POST['text1'];
          // TX to Arduino****************
          $writtenBytes = fputs($fp, $t);
          sleep(1); 
          // RX from Arduino**************
          $j=0;
          $dataset1 = [];
          while(!$buffer=stream_get_line($fp,400,"\n")) { 1; }
          // TX to PC***************
          $piecesa = explode(",", $buffer);
          foreach ($piecesa as $value) {  
              $dataset1[$j] = $value;
              $j++;
          }
          $myJSON = json_encode($dataset1);
          echo $myJSON;
          fclose($fp);
          ?>
          

          程序运行良好,延迟时间很短,大约 8 秒。最大。这是 Windows 操作系统。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-13
            • 1970-01-01
            相关资源
            最近更新 更多