я хочу передать число от 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. Однако, когда я посылаю «А», светодиод загорается.
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-инъекция.
в качестве быстрой проверки вы можете сделать это, чтобы убедиться, что вы имеете дело с правильными типами данных (то есть, если вы отправляете строку или 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);
}
}
}