从 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 - 处理串行通信

Arduino - Unity串行通信

Arduino Uno Raspberry Pi 串行通信双读数

python和arduino之间的串行通信

Raspberry Pi 和 Arduino 之间的简单 2 路串行通信

正确实现C#&lt;-&gt; Arduino串行通信