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会话中使用,而是去实现它.
小智 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
捕获单个字符。如果没有遇到新行,它可能会阻塞,直到有新行或缓冲区被刷新为止。一分钟的延迟可能是窗口每隔一段时间刷新其缓冲区。
解决这个问题的最简单方法是用另一种语言(例如 C++)编写程序,然后使用system()
. 在 C++ 中执行 Comm I/O 很简单。
这假设您有足够的服务器访问权限来配置它以允许可执行文件由 php 等运行。