我正在与Arduino UNO合作开展一个项目。我的任务是从Arduino接收数据并使用PHP将其保存到数据库(首先,我试图在PHP代码中获取数据,保存到数据库非常容易)。
我使用的是Windows操作系统。 使用WAMP,php版本:5.5.12
问题是:我无法弄清楚如何通过COM端口正确读取数据。
Arduino示例代码:
float temp;
int tempPin = 0;
void setup()
{
Serial.begin(9600);
temp = analogRead(tempPin);
temp = temp * 0.48828125;
Serial.print(temp);
}
void loop()
{
}
后面的PHP代码(arduino正在使用COM3):
<?php
exec("MODE COM3: BAUD=9600 PARITY=N DATA=8 STOP=1");
$portAddress = 'COM3:';
// Open connection on port
$port = fopen($portAddress, 'rb+');
stream_set_timeout($port, 0, 100);
stream_set_blocking($port,0);
// Necessary when the Arduino reset after the connection
sleep(2);
$msg = fread($port, 1);
// Close connection
fclose($port);
echo $msg;
?>
问题是,当我第一次运行php代码时,看起来它是循环不停止而不是打开连接。如果我尝试刷新页面,我会得到
我试过在论坛上查找其他问题,但我找不到类似的情况。有人可以指导我在PHP代码中获取值的解决方案吗?
答案 0 :(得分:1)
首先,我想补充一下:
delay(1000);
Serial.write(temp);
到Arduino草图中的主程序循环,为什么? - 如果没有这个,你的程序只会编写变量temp
一次,然后永远不做任何事情,所以添加它以使测试更容易。
接下来,您的PHP代码。看起来很简单,你是否运行具有提升权限的WAMP服务器? PHP正试图在硬件级别的Windows中访问COM,您需要提升权限。您正在使用rb+
因此禁用传输处理,它可能会通过不同的操作类型工作,因为PHP和机器之间存在层,例如可能篡改数据的WAMP服务器。您的时间不起作用,系统不同步,没有握手就无法预测Arduino的传输,您需要循环并等待直到收到传输才能处理它,这可能会对WAMP造成严重破坏服务器