在Windows上使用PHP进行串行通信

时间:2009-03-09 20:45:06

标签: php serial-port communication

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

我无法查看第一个解决方案的代码,因为它被编译成.dll(有意义,否则人们只能编辑延迟而不是购买它......)而第二个解决方案似乎只能使用fopen()打开端口,然后用fwrite()写入它,就像人们对流一样。但显然正在肆无忌惮地回归它。

我知道第一个解决方案可以做到这一点,虽然它确实需要Apache使用php-cgi模块而不是php5module。

有什么想法吗?

8 个答案:

答案 0 :(得分:10)

上述每个解决方案都是效率低下或工作量太大。

您可以使用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 install事件。

我不知道它是否应该在Apache会话中使用,而是去实现它。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

您需要使用类似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会捕获单个字符。如果没有遇到新行,它可能会阻塞直到有一行或直到刷新缓冲区。一分钟的延迟可能是窗口在一段时间内刷新缓冲区。

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

`

$output = mode COM3: BAUD=9600 PARITY=N data=8 stop=1 XON=off TO=on;
$fp = fopen('COM3', 'r+');

if (!$fp)
{
    exit("Unable to establish a connection");      
}

// RX form PC**************
$text1 = $_POST['text1'];
// TX to Arduino****************
$writtenBytes = fputs($fp, $text1);
sleep(1);
// RX from Arduino**************
$j=0;
$dataset1 = [];
$buffer = fgets($fp);
// TX to PC***************
$pieces = explode(",", $buffer);
foreach ($pieces as $value) {  
    $dataset1[$j] = $value;
    $j++;
}
echo json_encode($dataset1);
?>`

该程序在短暂的延迟(大约3秒)内运行良好。最大。