在 Windows 上使用 PHP 进行串行通信
-
06-07-2019 - |
题
我正在寻找一种在 Windows 上与 RS232 串行 COM 端口进行通信的方法。我在网上找到了2个解决方案, 一 这不是完全免费的(故意延迟该功能)并且 其他 Windows 上的功能有限。后者只能写入 Windows 上的 COM 端口,而不能读取。
我无法查看第一个解决方案的代码,因为它被编译成 .dll (这是有道理的,否则人们可以只编辑延迟而不购买它......)而第二个解决方案似乎只使用 fopen()打开端口,然后使用 fwrite() 对其进行写入,就像对流所做的那样。但显然害怕它没有任何回报。
我知道这是可能的,因为第一个解决方案就是这样做的,尽管它确实需要 Apache 使用 php-cgi 模块而不是 php5module。
有任何想法吗?
解决方案
上述每个解决方案要么效率低下,要么工作量太大。
你可以只使用 PHP-DIO 库 (dio_fcntl,dio_open,dio_read,dio_write,dio_seek,...)。它也在 PHP 手册中 DIO 的条目:
默认情况下,此 PECL 包不可用。如果您拥有高于 5.2.6 的 PHP 5.2.x,要获取 Windows 版本,您可以将其作为 ZIP 的一部分下载:
这两个链接都可以在以下位置找到 http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/
这是 Linux 上的构建, ,只需获取它并执行 phpize/configure/make/make install 即可。
我不知道它是否应该在 Apache 会话中使用,但是就用吧。
其他提示
解决这个问题的最简单方法是用另一种语言(如C ++)编写程序,然后使用 system()
从php脚本执行它。在C ++中进行Comm I / O是微不足道的。
这假设您有足够的访问权限来配置它以允许可执行文件由php等运行。
另一种可能的方法是使用Win32 API,例如 w32api_register_function()
或 ffi 然后使用串行通信调用,以使其在Windows下运行。
我遇到了同样的问题,当我遇到这个受Arduino开发人员欢迎的解决方案时,我已经考虑编写自己的php扩展了 - 'serproxy'(在很多地方找到它,即。 http://www.lspace.nildram.co.uk/freeware.html )设置tcp堆栈到/从串口并允许我使用php套接字函数与它通信。
您需要使用类似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
捕获单个字符。如果没有遇到新行,它可能会阻塞直到有一行或直到刷新缓冲区。一分钟的延迟可能是窗口在一段时间内刷新缓冲区。
另一种选择是在Windows上通过ActiveX使用对象。 Windows上的COM有几个主要是商业串行对象。您还可以公开基于.Net的对象并将其注册以供COM使用。当然,这确实假设您可以控制服务器注册COM控件,因为您需要一个串行接口。
如果要通过Web使用,则另一个问题是资源争用。例如,如果这是针对串行打印机的,则打印队列管理器将是您直接通信的最佳选择。
如果你想使用com端口来处理短信,那么这里最着名的是RémySanchez的php串口通信课程与谷歌示例代码。 这是一个包含该主题的主题。