从 php 到 arduino 的串行通信
Posted
技术标签:
【中文标题】从 php 到 arduino 的串行通信【英文标题】:serial communication from php to arduino 【发布时间】:2014-10-13 12:14:53 【问题描述】:我想将一个数字从 php 传递给 arduino。目前,我可以通过串口在 php 和 arduino 之间进行通信。但是,当我尝试将数字(int)从 php 传递给 arduino 时,arduino 无法识别它。然后我尝试传递它能够检测到的字符(char)。我已经尝试了多次,但我不知道代码有什么问题。下面是我的代码。
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 时,LED 不亮。但是当我发送“A”时,LED 亮起。
【问题讨论】:
我正在使用 php_serial.class.php 当然,当我发送 A 时,那里的 arduino 也会更改为 test=='A' 我正在使用 Windows 7 我已经通过将奇偶校验设置为 php 大小为 8N1 并将 arduino 大小设置为 7E1 解决了这个问题,因为任何奇数 1 的 ASCII 码都会有问题。 【参考方案1】:Serial.read()
返回 int
,而不是 char
(as shown here in the documentation)。
你的意思是,
“但是安东尼,它编译你...”
没错,它确实可以编译,甚至可以运行!
但这是因为您将char
'1' 的 ASCII 值与来自Serial.read();
的int
值进行比较
如下图所示,数字 1 的十进制值等于 49。
所以当你说
if(test == '1')
你实际上是在说
if( 1 == 49)
你想说的地方
if( test == 1)
ASCII 表
所以这里需要注意的是,它实际上还取决于您如何发送它。如果您作为一种数据类型发送,则接收另一种数据类型并将其与另一种数据类型进行比较。你会得到令人毛骨悚然的结果。
说了这么多,拜托,拜托....看在上帝的份上....参数化你在php中的插入。这就像 PHP SQL Injection 的海报子代码。
【讨论】:
【参考方案2】:作为一种快速检查,您是否可以这样做以确保您处理的是正确的数据类型(即,如果您发送一个字符串或一个 int 并检查其中一个或。
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.class.php 它正在发送一个字符串。以上是关于从 php 到 arduino 的串行通信的主要内容,如果未能解决你的问题,请参考以下文章
Arduino Uno Raspberry Pi 串行通信双读数