通过USB COM PORT从Arduino UNO检索数据

时间:2016-02-14 15:42:51

标签: php windows arduino serial-port

我正在与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代码时,看起来它是循环不停止而不是打开连接。如果我尝试刷新页面,我会得到 enter image description here

我试过在论坛上查找其他问题,但我找不到类似的情况。有人可以指导我在PHP代码中获取值的解决方案吗?

1 个答案:

答案 0 :(得分:1)

首先,我想补充一下:

delay(1000);
Serial.write(temp);

到Arduino草图中的主程序循环,为什么? - 如果没有这个,你的程序只会编写变量temp一次,然后永远不做任何事情,所以添加它以使测试更容易。

接下来,您的PHP代码。看起来很简单,你是否运行具有提升权限的WAMP服务器? PHP正试图在硬件级别的Windows中访问COM,您需要提升权限。您正在使用rb+因此禁用传输处理,它可能会通过不同的操作类型工作,因为PHP和机器之间存在层,例如可能篡改数据的WAMP服务器。您的时间不起作用,系统不同步,没有握手就无法预测Arduino的传输,您需要循环并等待直到收到传输才能处理它,这可能会对WAMP造成严重破坏服务器