последовательная связь от php до 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. Однако, когда я посылаю «А», светодиод загорается.

0

Решение

Serial.read() возвращает intне char (как показано здесь в документации).

Итак, вы говорите,

«но Энтони, это компилирует йо …»

Правда, он компилируется, и даже работает!

Но это потому, что вы сравниваете значение ASCII char «1» к int значение от Serial.read();

Как вы можете видеть на изображении ниже, десятичное значение числа 1 равно 49.

Итак, когда вы говорите

if(test == '1')

вы по сути говорите

if( 1 == 49)

Где, как вы хотите сказать

if( test == 1)

ASCII TABLE
введите описание изображения здесь

Таким образом, предостережение здесь действительно зависит от того, как вы его отправляете. Если вы отправляете как один тип данных, получаете другой и сравниваете его с другим. Вы будете иметь пугающие результаты.

Все это, как говорится, пожалуйста, пожалуйста, пожалуйста … Ради любви к Богу … Параметризируйте свой вкладыш в php. Это похоже на дочерний код плаката для PHP SQL-инъекция.

0

Другие решения

в качестве быстрой проверки вы можете сделать это, чтобы убедиться, что вы имеете дело с правильными типами данных (то есть, если вы отправляете строку или int и проверяете либо, либо.

void loop(){

if (Serial.available()) {

char ch = Serial.read();

if(ch == '1'){

// your led logic here

}

}

}

Хорошо, теперь, чтобы попытаться сократить длинную историю. Я проверил этот материал сам, и следующий код работает.
То, что я заметил, было то, что последовательный монитор в IDE Arduino должен был быть открыт для того, чтобы это работало как ожидалось. Когда он не был открыт, правильные данные не читались, и скрипт 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);

}

}
}
0