[英]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.