繁体   English   中英

从php到arduino的串行通讯

[英]serial communication from php to arduino

我想将数字从php传递到arduino。 目前,我能够通过串行端口在php和arduino之间进行通信。 但是,当我尝试将数字(int)从php传递到arduino时,arduino无法识别它。 然后我尝试传递一个能够检测到的字符(字符)。 我已经尝试了多次,但我不知道代码出了什么问题。 下面是我的代码。

PHP代码

$X = $_POST['x'];
$Y = $_POST['y'];

$query = "INSERT INTO target_position (X,Y,Date) VALUES('$X','$Y',now())";
$insert = mysql_query($query);

$serial = new phpSerial();
$serial ->deviceSet("COM6");    //Port number
$serial ->confbaudRate(9600);
$serial ->confParity("none");
$serial ->confCharacterLength(8);
$serial ->confStopBits(1);
$serial ->confFlowControl("none");
$serial ->deviceOpen();
$serial ->sendMessage('1');
//$serial ->sendMessage('$Y\r');
//$jinhong =$serial ->readPort();
$serial ->deviceClose();

//echo $jinhong;

这是arduino代码

int led =13;
int test=0;

void setup()
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}
void loop()
{
   while(Serial.available()==0);
   test=Serial.read();

   if(test=='1')
   {
      digitalWrite(led,HIGH);
      delay(500);
      digitalWrite(led,LOW);
      delay(500);
      digitalWrite(led,HIGH);
      delay(500);
      digitalWrite(led,LOW);
   }
}

谁能告诉我哪里出了问题? 当我发送1.时,指示灯不亮。但是,当我发送“ A”时,指示灯亮起。

作为快速检查,您可以执行此操作以确保您正在处理正确的数据类型(即,如果要发送字符串或整数,并检查或。

void loop(){

    if (Serial.available()) {

        char ch = Serial.read();

        if(ch == '1'){

            // your led logic here

        }

    }

}

好,现在就尝试将长话短说。 我自己测试了这些东西,下面的代码可以正常工作。 我注意到的是,需要打开arduino IDE中的串行监视器才能使其按预期工作。 如果未打开,则不会读取正确的数据,也不会退出PHP脚本。 我在这里的问题是您的arduino环境正在尝试通过您的PHP也在尝试通过的同一串行端口与设备进行通信。 您可能需要研究在尝试使用PHP脚本时如何禁用该通信。

<?php
include 'PhpSerial.php';

$serial = new PhpSerial;

$serial->deviceSet("/dev/tty.usbserial-A9IL9BF7");

$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");

$serial->deviceOpen();

$read = $serial->readPort();

$serial ->sendMessage('1');

$serial ->deviceClose();

?>


int led = 13;

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

void loop() {

    if (Serial.available() == 1) {

        char ch = Serial.read();

        if (ch == '1'){

            digitalWrite(led,HIGH);
            delay(500);
            digitalWrite(led,LOW);
            delay(500);
            digitalWrite(led,HIGH);
            delay(500);
            digitalWrite(led,LOW);

        }

    }
}

Serial.read()返回一个int ,而不是一个char (如文档中所示)

所以你说

“但是安东尼,它可以编译……”

是的,它确实可以编译,甚至可以运行!

但这是因为您正在将char '的ASCII值与Serial.read();int值进行比较Serial.read();

如下图所示,数字1的十进制值等于49。

所以当你说

if(test == '1')

你本质上是在说

if( 1 == 49)

你想说哪里

if( test == 1)

ASCII表 在此处输入图片说明

因此,需要注意的是,它实际上还取决于您发送它的方式。 如果以一种数据类型发送,则接收另一种数据类型,然后将其与另一种数据类型进行比较。 您将获得令人毛骨悚然的结果。

所有这一切,请,请..为了上帝的爱。...在php中参数化您的插入。 这就像PHP SQL Injection的发布者子代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM