我正在寻找一种与Windows上的RS232串行COM端口通信的方法。我在网上找到了2个解决方案,one并非完全免费(在功能上引入了故意延迟)和another在Windows上具有有限的功能。后者只能写入Windows上的COM端口,而不能读取。
我无法查看第一个解决方案的代码,因为它被编译成.dll(有意义,否则人们只能编辑延迟而不是购买它......)而第二个解决方案似乎只能使用fopen()打开端口,然后用fwrite()写入它,就像人们对流一样。但显然正在肆无忌惮地回归它。
我知道第一个解决方案可以做到这一点,虽然它确实需要Apache使用php-cgi模块而不是php5module。
有什么想法吗?
答案 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 code。 Here 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秒)内运行良好。最大。