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

sya*_*yaz 9 php serial-port communication

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

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

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

有任何想法吗?

Dus*_*rea 12

上述每个解决方案都是低效或过多的工作.

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

默认情况下,此PECL程序包不可用.如果您的PHP 5.2.x大于5.2.6,为了获得它,您可以将其作为ZIP的一部分下载:

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

这是Linux的构建,只需获取它并执行phpize/configure/make/make install.

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

  • 哦,我几年前问的时候你在哪里!接受这个答案. (3认同)

小智 6

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

比如下面这行通过php执行命令:

$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on`;
Run Code Online (Sandbox Code Playgroud)

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

echo "$output"; 
Run Code Online (Sandbox Code Playgroud)

创建资源 ID:

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

if (!$fp)
{
      echo "Port not accessible";
}
else
{
     echo "Port COM1 opened successfully";
}
Run Code Online (Sandbox Code Playgroud)

写入端口:

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

echo"Bytes written to port: $writtenBytes";
Run Code Online (Sandbox Code Playgroud)

从端口读取:

$buffer = fgets($fp);

echo "Read from buffer: $buffer";
Run Code Online (Sandbox Code Playgroud)

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

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


Soa*_*Box 5

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

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

  • 同意,但对我来说,这不再属于“最简单的方法”,而是“最好的方法”。:-) (3认同)