Arduino和PHP通过Serial incomingbyte读取

时间:2013-05-11 10:43:53

标签: php html serial-port arduino

我有通过网站控制Arduino二极管的PHP脚本,但我遇到了问题。

我的Arduino代码是:

int green = 8;
int incomingbyte;

void setup()
{
  Serial.begin(9600);
  pinMode(green,OUTPUT);
}

void loop()
{
  if(Serial.available() > 0)
  {
    incomingbyte = Serial.read();
  }
  if(incomingbyte == '0'){
  digitalWrite(green,HIGH);
  }
  if(incomingbyte == '1'){
  digitalWrite(green,LOW);
  }
}

我的PHP代码是:

<?php

error_reporting(E_ALL); 
ini_set("display_errors", 1);  

if (isset($_GET['action'])) {

    require("php_serial.class.php");

        $serial = new phpSerial();
        $serial->deviceSet("COM3");
        $serial->confBaudRate(9600);
        $serial->deviceOpen();

if ($_GET['action'] == "green1") {

        $serial->sendMessage("0\r");

} else if ($_GET['action'] == "green0") {

        $serial->sendMessage("1\r");
}

$serial->deviceClose();

}

我的HTML代码:

<!DOCTYPE html>
<html>
<head>
<title>ARDUINO</title>
</head>
<body>

<h1> ARDUINO AND PHP COMMUNICATION </h1>

<a href="led.php?action=green1">ON</a></br>
<a href="led.php?action=green0">OFF</a></br>

</body>
</html>

我有两个问题:

  1. Arduino只获得incomingbyte = 0,所以我可以打开二极管,但我无法将其关闭。我修改了代码来设置incomingbyte = 1来打开二极管,但它也不起作用。所以我认为Arduino只获得incomingbyte = 0。

  2. 运行脚本后,我的网站正在缩小。当我点击“ON”或“OFF”脚本正在运行时,我正在获得白色(空白)站点。我应该怎么做才能一直留在我的HTML网站上?

2 个答案:

答案 0 :(得分:4)

re:2在你的php表单处理程序下添加html代码 - 所以一切都是从同一个脚本提供的,或者使用

header() 

重新定位回html页面 - 但是你不能输出错误。

编辑所以单文件方式:

<?php
// led.php code in here
error_reporting(E_ALL); 
ini_set("display_errors", 1);  

if (isset($_GET['action'])) {
// and so on ...



?>
<!--// now show your html form regardless 
of whether the form was submitted or not // -->
<!DOCTYPE html>
<html>
<head>
<title>ARDUINO</title>
</head>
<body>

<h1> ARDUINO AND PHP COMMUNICATION </h1>

<a href="?action=green1">ON</a></br>
<a href="?action=green0">OFF</a></br>

</body>
</html>

编辑尝试使解决方案更清晰一点。请注意,您不必将led.php添加到链接中,它们将被提交回同一文件。

答案 1 :(得分:0)

嘿,我刚刚为你的代码找出了两个重要的变化......

1&gt;更改

$serial->sendMessage("0\r");

$serial->sendMessage('0');

和发送'1'相同。

2&gt;包括sleep命令。像这样

$serial = new phpSerial();
    $serial->deviceSet("COM3");
    $serial->confBaudRate(9600);
    $serial->deviceOpen();
    sleep(2);

sleep命令插入延迟。当

中的php打开串口时
$serial->deviceopen();

命令arduino自动重置。因此,当php执行下一个arduino将无法接收它们的命令时,因此可能无法采取行动。 2是最好的延迟,因为1非常短,而其他超过2则很长。 使用与上述帖子相同的文件中的php和html代码,并将其命名为“name.php”,而不是“”。 这对我有用....