10

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

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

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

有任何想法吗?

4

8 回答 8

14

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

您可以只使用PHP-DIO 库(dio_fcntl、dio_open、dio_read、dio_write、dio_seek,...)。它也在PHP 手册的 DIO 条目中

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

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

这是来自 Linux 的构建,只需获取它并执行 phpize/configure/make/make 安装即可。

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

于 2011-08-28T17:28:56.813 回答
6

您需要使用类似 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 专家可以提供帮助。

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

于 2009-07-02T13:14:14.150 回答
4

解决这个问题的最简单方法是用另一种语言(例如 C++)编写程序,然后使用system(). 在 C++ 中执行 Comm I/O 是微不足道的。

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

于 2009-03-09T20:50:55.493 回答
3

另一种可能的方法是通过类似w32api_register_function()ffi的方式使用 Win32 API ,然后使用串行通信调用使其在 Windows 下工作。

于 2009-03-09T21:02:54.670 回答
3

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

于 2010-11-08T18:50:05.913 回答
1

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

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

于 2009-04-07T16:53:55.160 回答
1

如果您想使用 com 端口处理 sms,那么这里是Rémy Sanchez最著名的php 串行通信类和google 示例代码这是一个包含该主题的线程。

于 2014-01-04T16:35:10.710 回答
0

我使用了 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 操作系统。

于 2019-12-15T00:58:15.147 回答