Я работаю над проектом с Arduino UNO. Моя задача — получить данные из Arduino и сохранить их в базе данных с помощью PHP (сначала я пытаюсь получить данные в php-коде, сохранение в базу данных довольно просто).
Я использую операционную систему Windows.
Используя WAMP, версия php: 5.5.12
Проблема в том, что я не могу понять, как правильно читать данные через COM-порт.
Пример кода Arduino:
float temp;
int tempPin = 0;
void setup()
{
Serial.begin(9600);
temp = analogRead(tempPin);
temp = temp * 0.48828125;
Serial.print(temp);
}
void loop()
{
}
Код PHP позади (Arduino использует COM3):
<?php
exec("MODE COM3: BAUD=9600 PARITY=N DATA=8 STOP=1");
$portAddress = 'COM3:';
// Open connection on port
$port = fopen($portAddress, 'rb+');
stream_set_timeout($port, 0, 100);
stream_set_blocking($port,0);
// Necessary when the Arduino reset after the connection
sleep(2);$msg = fread($port, 1);
// Close connection
fclose($port);
echo $msg;
?>
проблема в том, что когда я впервые запускаю код php, похоже, что он зацикливается без остановки и не открывает соединение. Если я пытаюсь обновить страницу, я получаю
Я попытался найти другие вопросы на форуме, но не смог найти похожую ситуацию. Может ли кто-нибудь направить меня к решению взять значение в PHP-код?
Для начала я бы добавил:
delay(1000);
Serial.write(temp);
К вашему основному циклу программы в скриншоте Arduino, почему? — Без этого ваша программа просто напишет переменную temp
один раз, а потом ничего не делайте навсегда, поэтому добавьте это, чтобы облегчить тестирование.
Далее ваш код PHP. Кажется, что-то простое, вы используете сервер WAMP с повышенными правами доступа? PHP пытается получить доступ к COM в Windows на аппаратном уровне, вам потребуются повышенные разрешения. Вы используете rb+
поэтому обработка передачи отключена, может оказаться, что она работает через различные типы действий, потому что между PHP и машиной существуют слои, например, сервер WAMP, который может вмешиваться в данные. Ваше время не сработает, система не синхронизирована, передачу Arduino невозможно предвидеть без рукопожатия, вам нужно зациклить и подождать, пока передача не будет получена, прежде чем ее обработать, что может нанести ущерб WAMP сервер.
Других решений пока нет …